日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

如何使用Instruments诊断App(Swift版):起步

發(fā)布時間:2023/12/4 编程问答 55 豆豆
生活随笔 收集整理的這篇文章主要介紹了 如何使用Instruments诊断App(Swift版):起步 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

2019獨角獸企業(yè)重金招聘Python工程師標準>>>

本文由Mr_cyz(博客)翻譯自raywenderlich,歡迎參與我們的翻譯活動。
原文:Instruments Tutorial with Swift: Getting Started



更新記錄:該教程由 James Frost 更新至iOS8,swift語言。 原版本 由我們隊伍中的一員Matt Galloway編寫。

無論你寫過許多iOS應(yīng)用,還是剛剛開始你的第一個應(yīng)用,毫無疑問,你都會想出一些新點子,或者想去弄明白你該怎么做,來讓你的app變得更好。

除去添加新特性來優(yōu)化你的應(yīng)用,有一件事是所有好的開發(fā)者都回去做的,那就是診斷他們的代碼。

該教程將向你展示怎么樣去使用Xcode提供的工具"Instrument"中最重要的一些功能。幫助你檢查自己代碼中的性能問題、內(nèi)存管理問題、循環(huán)引用問題以及其他種種。

在本篇教程中,你將學到:

  • 怎樣使用Time Profiler工具來定位你的代碼中的"高消耗點(hot-spot)",從而讓你的代碼更加有效率。

  • 怎樣使用Allocations工具來檢測和改正代碼中的內(nèi)存管理問題,例如循環(huán)強引用。

注意:本教程假定你已經(jīng)上手了iOS開發(fā)和swift語言。如果你是iOS開發(fā)的初學者,你可能更適合去看一下本網(wǎng)站上的其他教程。本篇教程還使用了storyboard,所以確保你熟悉相關(guān)概念。本網(wǎng)站上的這篇教程是一個很好的起點。
(編輯注:如果你想全面了解Instruments,請參看:Instruments 用戶指南【中文完整翻譯版】)

一切就緒?準備好進入instrument的迷人的世界中吧。

起步

在本篇教程中,你無需從頭開始創(chuàng)建一個完整的應(yīng)用,我們已經(jīng)為你提供了一個示例程序,你的任務(wù)是瀏覽這個應(yīng)用,然后使用instrument作為你的助手來改善這個應(yīng)用--類似于你優(yōu)化自己的應(yīng)用的過程。

從這里下載starter project,解壓后使用Xcode打開。

該示例程序使用Flickr提供的API來搜索圖片。你需要一個API key來使用這個API。對樣例程序而言,你可以去Flickr的網(wǎng)站上創(chuàng)建一個樣例key,然后就可以通過網(wǎng)站http://www.flickr.com/services/api/explore/?method=flickr.photos.search?來搜索圖片,并使用時把API key拷貝到上述url的最后面,格式為"&api_key=",接下來的參數(shù)同樣加到&后面。

例如,如果URL是http://api.flickr.com/services/rest/?method=flickr.photos.search&api_key=6593783efea8e7f6dfc6b70bc03d2afb&format=rest&api_sig=f24f4e98063a9b8ecc8b522b238d5e2f? ,那么API key就是6593783efea8e7f6dfc6b70bc03d2afb。

把這個key粘貼到FlickrSearcher.swift文件頂部,取代原有的key。

需要注意的是,該key每隔一天左右都會改變,所以你可能碰巧需要去重新生成一個key。如果key不可用了,你的應(yīng)用將會提醒你。

編譯并運行應(yīng)用,執(zhí)行一次查詢,然后點擊一個結(jié)果,你將會看到類似下面的界面。

瀏覽一下這個應(yīng)用,弄清楚基本的功能,你可能會想,一旦UI看起來不錯后,這個應(yīng)用就準備好上傳了。然而,接下來你將看到使用Instruments工具后將為你的app帶來多少好處。

本教程剩下的內(nèi)容將會向你展示怎么樣找到并改正存在于你的應(yīng)用中的問題。你將看到Instruments工具怎么樣使debug程序的工作變得易如反掌。

時間分析儀

首先你將使用的工具是Time Profiler。在每個測量時間間隔內(nèi),該工具將暫停程序執(zhí)行,在每個線程上進行一次棧追蹤(stack trace),可以想象成點了Xcode調(diào)試工具中的暫停鍵。

這里有一張Time Profiler的預(yù)覽圖。

這個界面展示的是調(diào)用樹(call tree)。調(diào)用樹展示的是一個app中執(zhí)行不同的方法花費的時間,每一行都是程序執(zhí)行路徑中的一個不同的方法,每個方法花費的時間可以由分析工具在其中暫停的次數(shù)來決定。

例如,如果有100件事情要做,每件花費1毫秒,在棧頂?shù)姆椒ㄗ隽似渲?0件,那么你可以推斷出,大約在總執(zhí)行時間中的10%--10毫秒--花費在了這個方法中。這是相當粗糙的估計,但確實有效!

注意:通常來說,你應(yīng)該總是在真機上分析你的app,而不是在模擬器上。iOS模擬器有你的Mac提供的性能支撐,但是真機作為硬件移動設(shè)備,資源是有限的。所以你的app可能在模擬器上運行得很好,但是一旦它運行到真機上,你可能就會發(fā)現(xiàn)有性能問題。

那么立刻開始分析吧。

從Xcode的菜單欄中,選擇product/profile,或者按下commond+I,這時會編譯程序,加載Instruments工具,然后會出現(xiàn)一個選擇框,類似于下面的圖片:

Instruments提供了不同的模板。

選擇Time Profiler工具,然后點擊Choose,這時會出現(xiàn)一個新的工具文件。點擊左上角的紅色記錄按鈕,開始記錄并加載你的app,你可能需要輸入密碼來為Instruments分析其他進程授權(quán)--不用擔心,這很安全。

在Instruments窗口中,可以看到一個計時器,還有一個小箭頭在屏幕中央的圖表上從左向右移動。這表明app正在運行。

現(xiàn)在開始使用這款app,搜索圖片,然后點擊幾個查詢結(jié)果進入詳情界面,你可能會發(fā)現(xiàn)進入一個詳情界面非常慢,另外滑動查詢結(jié)果的列表也是慢得難以置信--這是一款笨重的app。

然而,你是幸運的,因為接下來你就會修正這一問題。不過在這之前你要先快速瀏覽一下當前展示的這個Instruments的界面。

首先,確保右手邊工具欄上的視圖選擇器的每一個選項都被選中,如下:

這樣就確保所有的面板都被打開。現(xiàn)在看一下下面的截圖和每一部分的說明。

1、這里控制記錄過程,點擊紅色的"記錄"按鈕可以停止或開始當前正在分析的app(在記錄和停止按鈕之間切換),暫停鍵,如你所想,暫停當前正在運行的app。

2、這里是執(zhí)行計時器(run timer),計時器記錄著正在分析的app執(zhí)行了多長時間、執(zhí)行了多少次。如果你使用記錄控制按鈕來停止你的app,然后重啟,這將創(chuàng)建一個新的運行記錄,同時會顯示"Run 2 of 2"。

3、這里被稱作路徑(track),就你選擇的Time Profiler工具而言,因為只有一個工具,所以這里只有一條路徑,關(guān)于這里顯示的圖標的詳情,一會你就會在接下來的教程中了解更多。

4、這里是詳情面板,展示的是你正在使用的工具的主要信息。就現(xiàn)在而言,這里展示的是最"笨重(hottest)"的方法--換句話說,占用CPU時間最長的方法。點擊上方的bar會看到Call Tree(左手邊的那個)并選中Sample List,然后你會看到數(shù)據(jù)的不同視圖。視圖展示了每一個示例。點擊其中幾個,你會在Extended Detail inspector中看到被捕獲的堆棧跟蹤。

5、這里是檢查器(inspector)面板,一共有三個檢查器:record setting(記錄設(shè)置),display setting(展示設(shè)置),還有extends detail(擴展詳情)。一會你將了解更多關(guān)于這里面的一些選項。

現(xiàn)在開始診斷這笨重的UI!:]

更進一步

搜索一次圖片,然后點擊結(jié)果進入詳情界面,我個人喜歡搜索"狗",不過選一個你喜歡的就好--你可能是想搜索貓的一員:]

現(xiàn)在連續(xù)上下滾動列表數(shù)次,這樣你就在Time Profile工具中得到足夠的數(shù)據(jù)了,可以發(fā)現(xiàn)屏幕中央的數(shù)字在改變,圖表也開始被填充,這說明正在占用CPU循環(huán)。

你當然不希望任何UI如此笨重,那么table view就絕對不會被忽略,除非它滾動起來非常流暢。

要定位這里的問題,你需要設(shè)置一些選項。

在右手邊,選擇display setting(或者按下commond+2),在該選擇器中,在Call Tree欄下選中Separate by Thread, Invert Call Tree, Hide Missing Symbols??Hide System Libraries選項,你的界面應(yīng)該看起來是這樣的:

下面解釋了每一個選項對左側(cè)列表中數(shù)據(jù)的顯示起了什么作用:

  • Separate by Thread:每個線程被單獨考慮。這能讓你知道哪一個線程占用CPU最多。

  • Invert Call Tree:選中該選項后,調(diào)用棧會自上至下顯示。這通常是你需要的,因為你想知道CPU花費時間的那個最深的方法。

  • Hide Missing Symbols:如果在你的app或者框架中找不到dSYM文件,那么你將只能在列表中看到二進制代碼中的十六進制地址值,而不是方法的名稱(符號)。選中該選項后,只有能被解析的符號可以被顯示出來,未被解析的十六進制數(shù)值會被隱藏,這有助于清理顯示的數(shù)據(jù)。

  • Hide System Libraries:選中該選項后,只有你自己app中出現(xiàn)的符號會被顯示出來。通常選中該選項是有用的,因為你只關(guān)心CPU在你自己的代碼中的哪一部分花費時間,你沒法對系統(tǒng)庫使用CPU做多少改變。

  • Flatten Recursion:該選項將每一個調(diào)用棧中的遞歸函數(shù)(調(diào)用它們自身的函數(shù))視作單一入口,而不是多入口。

  • Top Functions:選上這一選項讓Instruments將花費在一個函數(shù)中的總時間視作在該函數(shù)中直接花費的時間加上調(diào)用的其他函數(shù)花費的時間。所以如果函數(shù)A調(diào)用了函數(shù)B,那么函數(shù)A花費的總時間被記為A花費的時間加上B花費的時間。這一選項非常有用,因為它能讓你在每次進入調(diào)用棧時找到花費最長的時間,瞄準你最耗時的方法。

如果你正在使用Objective-C寫的app,那么這里還有一個選項:Show Obj-C Only,選擇該選項后,只展示Objective-C方法,不展示其他任何C或C++的函數(shù)。目前你的app中沒有C或C++函數(shù),但是舉例來說,如果你正在看的是一款OpenGL應(yīng)用,那么可能會有一些C++的函數(shù)。

盡管一些值可能會有輕微的不同,不過如果你選中了上面提到的幾個選項后,列表中展示的入口的順序應(yīng)該是類似于下圖的:

額,這看起來不怎么好,大量的時間被花在設(shè)置縮略圖的"色調(diào)"濾鏡('tonal'filter)的方法上了。這應(yīng)該不會太讓你驚訝,因為列表的加載與滾動是UI中最笨重的部分,而這里正式列表單元格被持續(xù)加載的地方。

為了解到更多關(guān)于這個方法做了什么的信息,雙擊列表中的這一行,這樣將把你帶到下面的視圖中:

這很有趣,不是嗎?applyTonalFilter()是一個UIImage擴展中的一個方法,幾乎100%的時間被花費在這個方法中的應(yīng)用圖片濾鏡后創(chuàng)建CGImage輸出這一地方了。

我們沒辦法為這一過程加速,創(chuàng)建一張圖片是個費時的過程。讓我們回退一步,看看applyTonalFilter()是從哪里調(diào)用的。點擊代碼界面的頂部欄中的Call Tree,回到上一界面。

然后點擊列表頂部applyTonalFilter左側(cè)的小箭頭,這樣就展開了Call Tree,展示出applyTonalFilter的調(diào)用者。你可能需要再展開到下一行。當你分析的是swift代碼時,有時在Call Tree中會出現(xiàn)重復(fù)的一行,以@objc為前綴,此時你只需要關(guān)心第一行,以你的app的target名稱為前綴(本例為InstrumentsTutorial)。

這里,該行代指collection view的cellForItemAtIndexPath方法的結(jié)果,雙擊該行可以看到工程中相關(guān)的代碼。

現(xiàn)在你知道問題出在哪了。應(yīng)用色調(diào)濾鏡的方法占用了較長的時間,而該方法又直接從cellForItemAtIndexPath中調(diào)用,這樣每當該方法要求一個被濾鏡渲染的圖片時都會會阻塞主線程(整個UI)。

卸下重任

要解決這一問題,可以分兩步來:首先使用dispatch_async將創(chuàng)建濾鏡的方法放到后臺線程,接著在每一張圖片被創(chuàng)建后都緩存起來。我們的工程中有一個簡單的圖片緩存類(有一個易記的名字:ImageCache),簡單地將圖片保存到內(nèi)存中,然后通過給定的鍵來獲取它們)。

現(xiàn)在可以切換到Xcode上,手動找到當前你正在Instruments中看的源文件,不過現(xiàn)在在你的眼前,右側(cè)就有一個快捷按鈕Open in Xcode,在面板的代碼部分的上面找到它并點擊:

這樣,Xcode就定位到正確的位置了。

接下來,在collectionView(_:cellForItemAtIndexPath:)方法中,把調(diào)用loadThumbnail()方法替換為下面的代碼:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 flickrPhoto.loadThumbnail?{?image,?error?in if?cell.flickrPhoto?==?flickrPhoto?{ if?flickrPhoto.isFavourite?{ cell.imageView.image?=?image }?else?{ if?let?cachedImage?=?ImageCache.sharedCache.imageForKey("\(flickrPhoto.photoID)-filtered")?{ cell.imageView.image?=?cachedImage }?else?{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,?0),?{ if?let?filteredImage?=?image?.applyTonalFilter()?{ ImageCache.sharedCache.setImage(filteredImage,?forKey:?"\(flickrPhoto.photoID)-filtered") dispatch_async(dispatch_get_main_queue(),?{ cell.imageView.image?=?filteredImage }) } }) } } } }

這段代碼的第一部分和之前一樣,從網(wǎng)絡(luò)上加載Flickr的圖片,如果該圖片被渲染過,那么cell直接展示相應(yīng)的縮略圖,如果沒有被渲染過,就將色調(diào)濾鏡應(yīng)用到圖片上。

接下來就是改變的地方,首先代碼檢查圖片的濾鏡是否存在于圖片緩存中,如果是,那么直接交由image view展示,如果沒有,那么為圖片添加色調(diào)濾鏡的方法被分配到后臺隊列中執(zhí)行,當該濾鏡被渲染好以后,將渲染后的圖片保存到緩存中,在主線程中讓image view顯示圖片。

這樣就解決了需要濾鏡的圖片的問題,不過還需要考慮從Flickr請求下來的原本的縮略圖。打開FlickrSearcher.swift,找到loadThumbnail(_:),將其替換為:

1 2 3 4 5 6 7 8 9 10 11 12 func?loadThumbnail(completion:?ImageLoadCompletion)?{ if?let?image?=?ImageCache.sharedCache.imageForKey(photoID)?{ completion(image:?image,?error:?nil) }?else?{ loadImageFromURL(URL:?flickrImageURL(size:?"m"))?{?image,?error?in if?let?image?=?image?{ ImageCache.sharedCache.setImage(image,?forKey:?self.photoID) } completion(image:?image,?error:?error) } } }

這里與處理濾鏡圖片類似,如果一張圖片已經(jīng)存在于緩存中,那么直接用緩存的圖片來調(diào)用completion回調(diào),否則從Flickr上請求圖片并保存到緩存中。

通過Product/Profile(或者commond+I,記住,這些快捷鍵可以節(jié)省你大量時間)打開Instruments,重新運行app。

可以發(fā)現(xiàn)這一次你不需要選擇使用哪個工具,因為你的app仍然在一個窗口中打開著,Instruments假定你想以同樣的選項再次運行。

進行幾次搜索,可以發(fā)現(xiàn)這次UI不是那么慢了,現(xiàn)在圖片濾鏡是異步渲染,圖片也在后臺被緩存,所以它們只需要被渲染一次,可以在Call Tree中看到幾個dispatch_worker_threads,這里是處理繁重的加載圖片濾鏡的過程。

看起來不錯,是時候做一次跨越了:]

分配、分配、分配

本教程要介紹的下一個工具是Allocations工具,它可以給你關(guān)于所有被創(chuàng)建的對象和它們背后使用的內(nèi)存的詳細信息。它也能顯示出每個對象的引用計數(shù)。

要打開一個新的分析工具,首先退出Instruments工具。這次,編譯并運行app,在導(dǎo)航欄中點開Debug欄,然后點擊Memory就可以在主窗口中顯示內(nèi)存的使用圖表。

這些圖表可以幫你大體上了解你的app的表現(xiàn),不過你需要更強大的功能。點擊Profile in Instruments按鈕,然后可以把這部分轉(zhuǎn)換到Instruments中。Allocations工具會自動打開。

這次你需要注意兩個追蹤,第一個叫做分配(Allocations),第二個是泄露(Leaks),分配追蹤將在下文詳細討論,通常泄露追蹤在Objective-C中更有用,所以本篇教程不會涉及。

那么接下來你將去查找哪個bug呢?

有些事被隱藏在工程中,你可能不知道它的存在。你可能聽說過內(nèi)存泄露,但不知道其實有兩種泄露:

1、"真正的內(nèi)存泄露(True memory leaks)"是指一個對象不再被引用但卻沒有被釋放--這說明內(nèi)存永遠不能被復(fù)用,即使有swift和ARC幫助管理內(nèi)存,最常見的內(nèi)存泄露問題是保留環(huán),或稱為強引用環(huán)。當兩個對象互相持有對方的強引用時,每個對象保證另一個不會被釋放,這樣它們的內(nèi)存將永遠不能被釋放!

2、"無限內(nèi)存增長(Unbounded memory growth)"是指內(nèi)存持續(xù)被分配而沒有機會被釋放。如果這一現(xiàn)象永遠持續(xù)下去,某一點上系統(tǒng)資源將被占滿,這樣你就親手創(chuàng)建了一個大的內(nèi)存問題。在iOS上意味著你的app將被系統(tǒng)殺死。

Allocations工具運行在app上時,進行五次不同的搜索,但不要點進詳細界面,確保每次搜索都有一些結(jié)果,現(xiàn)在讓app靜止等待幾秒鐘。

你應(yīng)該能注意到Allocations追蹤中的圖表一直在增長,這說明內(nèi)存正在被分配,這一特點將指導(dǎo)你找到無限內(nèi)存增長問題。

接下來你要執(zhí)行"分配分析(generation analysis)",要做到這一點,點擊Mark Generation按鈕,你可以在Display Setting檢查器的頂部找到這一按鈕。

按下它,你將會發(fā)現(xiàn)一個紅旗出現(xiàn)在追蹤中,如下:

分配分析的目的是多次執(zhí)行一個事件,查看內(nèi)存是否以無限的形式增長,點擊進入搜索的詳情界面,等待幾秒鐘的圖片加載,然后返回主頁,再一次mark generation,對于不同的搜索重復(fù)幾次這樣的操作。

在進入幾次詳情界面以后,Instruments將看起來如下圖所示:

這時你應(yīng)該會有所起疑,可以注意到每次搜索并進入詳情界面后藍色的圖表都在增長,這樣肯定不好。不過等一下,內(nèi)存警告呢?你應(yīng)該知道的,內(nèi)存警告是iOS告訴app內(nèi)存緊缺的一種方式,并通知你你需要清理一些內(nèi)存。

有可能這種增長不僅僅是你的app造成的,它可能是UIKit內(nèi)部使用內(nèi)存的結(jié)果。所以在指定具體哪一個出現(xiàn)問題之前,給系統(tǒng)框架和你的app一個機會來清理自己的內(nèi)存。

可以在Instruments的菜單欄中選擇Instrument\Simulate Memory Warning來模擬一次內(nèi)存警告,或者從模擬器的菜單欄中選擇Hardware\Simulate Memory Warning。你會注意到內(nèi)存使用圖下陷了一點,也可能根本沒有。很顯然使用圖沒有回到應(yīng)該的位置上,因此你的程序的某處依然有無限內(nèi)存增長的問題。

每次點入詳情界面后都做一次標記的原因是,你可以看到在每個標記段之間哪些內(nèi)存被分配了。看一眼詳情面板,你會發(fā)現(xiàn)有大量的內(nèi)存分配。

漫談分配

在每一個generation段中,你可以看到所有自標記以來被分配了內(nèi)存空間,并且一直存活的對象。隨后的每個generation段中只包含自上一個標記之后的符合上述描述的對象。

看一眼Growth欄,你就會發(fā)現(xiàn)肯定在某處存在著增長問題,展開其中一個generation,你會看到如下圖界面:

哇,有好多的對象,我們從哪開始呢?

很不幸,在這一界面上swift比Objective-C雜亂得多,因為這里充滿了你并不需要了解的內(nèi)部數(shù)據(jù)結(jié)構(gòu)。你可以通過切換Allocation Type至All Heap Allocations來方便地清除掉它們。當然也可以點擊頂部的Growth頭,讓對象按照大小排序。

最頂部的對象是ImageIO_jpeg_Data,并且這肯定是你的app創(chuàng)造的對象。點擊ImageIO_jpeg_Data左側(cè)的箭頭展開詳情列表,選中一行,然后打開Extended Detail檢查器(或者按下commond+3)。

這里顯示的是當指定對象被創(chuàng)建時的棧追蹤,灰色部分的屬于系統(tǒng)框架,黑色部分是你的app中的。要了解這一追蹤的更多信息,雙擊黑色部分倒數(shù)第二行,這是唯一以InstrumentsTutorial開頭的一行,代表它是來自swift代碼的。雙擊它會把你帶到相關(guān)方法的代碼界面--你的老朋友collectionView(_:cellForItemAtIndexPath:)。

Instruments非常有用,但是這里它不能幫你更多了,現(xiàn)在你必須親自瀏覽一遍代碼來了解這里到底發(fā)生了什么。

看一遍代碼,你會發(fā)現(xiàn)它調(diào)用了setImage(_:forKey:)方法,正如你在Time Profiler中看到的,這個方法緩存圖像以便之后在app中復(fù)用。啊哈,聽起來就像一個問題。

再次點擊Open in Xcode跳入Xcode界面,打開ImageUtilities.swift,看一下setImage(_:forKey:)的實現(xiàn):

1 2 3 func?setImage(image:?UIImage,?forKey?key:?String)?{ images[key]?=?image }

這里以Flickr的圖片ID作為鍵,將圖片保存到字典中。但是如果你整體瀏覽一遍代碼,你會發(fā)現(xiàn)圖片永遠不會從字典中被清除。

這就是你的無限內(nèi)存增長的來源:所有事情都按照設(shè)定來工作,但是app永遠不會清除緩存--它只是不斷地往里增加。

要解決這一問題,你需要做的是讓ImageCache監(jiān)聽從UIApplication發(fā)來的內(nèi)存警告的通知。當它收到通知后就清除掉它的緩存。

要讓ImageCache監(jiān)聽通知,在該類中添加init和deinit方法:

1 2 3 4 5 6 7 8 9 10 11 12 13 init()?{ NSNotificationCenter.defaultCenter().addObserverForName( UIApplicationDidReceiveMemoryWarningNotification, object:?nil,?queue:?NSOperationQueue.mainQueue())?{?notification?in self.images.removeAll(keepCapacity:?false) } } deinit?{ NSNotificationCenter.defaultCenter().removeObserver(self, name:?UIApplicationDidReceiveMemoryWarningNotification, object:?nil) }

這里注冊了UIApplicationDidReceiveMemoryWarningNotification的觀察者來執(zhí)行上面的閉包,清除圖片緩存。

代碼需要做的就是移除緩存中的所有對象,這樣就確保這些圖像不再占有什么資源,它們將被釋放掉。

為了測試這一修改,再次啟動Instruments(在Xcode中按下快捷鍵commond+I),重復(fù)之前的步驟,別忘了最后模擬一次內(nèi)存警告。

注意:確保你是從Xcode中啟動并經(jīng)過編譯,而不是僅僅按下Instruments中的紅色按鈕,這樣才能確保你使用的是最新的代碼。你也可能需要在進行分析之前先編譯運行一次,因為有時如果你直接分析,那么Xcode似乎沒有將模擬器中的app編譯更新到最新代碼上。

這一次的分配分析應(yīng)該看起來是這樣的:

可以發(fā)現(xiàn)在內(nèi)存警告之后內(nèi)存的使用下跌了。總體上依然有很多內(nèi)存增長,但是不像之前那樣多了。

現(xiàn)在依然有很多內(nèi)存增長是由系統(tǒng)庫造成的,并且你也沒法對其做一些改進。這些系統(tǒng)庫并沒有釋放它們的全部內(nèi)存,這有可能是刻意設(shè)計的,也有可能是一個bug。你能對你的app做的就是盡可能多地釋放內(nèi)存,而這一點你已經(jīng)做到了! :]

非常好!又解決了一個問題!是時候進行新的跨越了。哦等等,還有第一種類型的泄露問題你沒有涉及到。

強引用周期

最后,你將尋找在Flickr圖片搜索app中的強引用環(huán)。正如之前提到的,當兩個對象互相持有對方的強引用時會出現(xiàn)強引用環(huán)。你可以用另一種方式使用Allocations工具來檢測這一環(huán)。

注意:為保證你能跟上這篇教程的這一部分,你必須在一個真機上來分析你的app。不幸的是在寫該教程時,當在模擬器上運行app并啟用Allocations工具時會出現(xiàn)一個bug:大多數(shù)在工程中使用到的類無法出現(xiàn)在Instruments中。

關(guān)閉Instruments,返回Xcode,確保你的app的構(gòu)建目標選中為真機設(shè)備。再一次選中Product\Profile,然后選擇Allocations模板。

這一次,你不再使用分配分析,取而代之的是,你要看存在于內(nèi)存中的不同類型對象的數(shù)量。你應(yīng)該已經(jīng)看過數(shù)量龐大的對象填充于詳情面板--數(shù)量太多以至于看不過來。

為了篩選自己感興趣的對象,在Allocations Summary列表上方的文本框中輸入Instruments作為篩選詞,這樣就只會顯示類型名中帶有Instruments關(guān)鍵詞的對象。因為我們的示例工程名稱為InstrumentsTutorial,Allocations列表將僅僅顯示這個工程中定義的那部分類型的對象。這樣就簡化了些工作。

這里有兩列值得一提:#Persistent#Transient,Persistent這一列記錄了存在于內(nèi)存中的每一類型的對象的數(shù)量。Transient這一列記錄了曾經(jīng)存在但是現(xiàn)在已經(jīng)被銷毀了的對象的數(shù)量。Persistent對象(持久對象)正在使用內(nèi)存,而Transient對象(臨時對象)已經(jīng)將它們占用的內(nèi)存釋放了。

你應(yīng)該能看到有一個持久對象實例:ViewController,那就對了,因為這就是你當前看到的界面。除此之外,還有AppDelegate,還有一個Flickr API客戶端的實例。

回到app中,執(zhí)行一次搜索并點進詳情界面,注意到有大量新的對象出現(xiàn)在Instruments中:解析搜索結(jié)果時創(chuàng)建的FlickrPhotos、還有SearchResultsViewController、還有ImageCache,ViewController實例依然是持久對象,因為它被它的導(dǎo)航控制器持有,這樣很好。

現(xiàn)在按下返回按鈕,SearchResultsViewController被從導(dǎo)航棧中彈出

,所以它應(yīng)該被銷毀。但是Allocations統(tǒng)計中#Presistent這一列依然顯示著數(shù)量為1,為什么依然存在呢?

試著進行另外兩次搜索并每次都通過back按鈕返回,現(xiàn)在一共有3個SearchResultsViewControllers?!這些視圖控制器依然存在于內(nèi)存中的事實說明有其他對象持有它們的強引用,看起來你有一個強引用周期。

此時你的主要線索是,不只SearchResultsViewController存在,所有的SearchResultsCollectionViewCells也存在。看起來好像保留環(huán)是存在于這兩個類之間的。

很不幸,在編寫本教程時,Instruments對swift的輸出在一些情況下并不是怎么很有用,這里Instruments只能給你一些關(guān)于問題出在哪里的提示,并展示對象從哪里分配的,接下來解決問題就是你的工作了。

讓我們?nèi)ゴa中一探究竟。把鼠標放到Category一欄的InstrumentsTutorial.SearchResultsCollectionViewCell上面,點擊右邊的小箭頭,接下來的視圖展示了運行app時SearchResultsCollectionViewCells的所有分配情況。有非常多的實例--每一個查詢結(jié)果對應(yīng)一個。

通過點擊面板頂部第三個按鈕切換檢查器到Extended Detail檢查器,這一檢查器顯示的是當前選中分配的棧追蹤。和之前的棧追蹤一樣,黑色部分是你的代碼,雙擊最頂部的黑色的一行(以InstrumentsTutorial開頭),看一下cell在哪被分配。

Cell是在collectionView(cellForRowAtIndexPath:)的一開始被分配的。如果你瀏覽接下來幾行,你會看到這個(很不幸,Instruments沒有給你提示顯示):

1 2 3 cell.heartToggleHandler?=?{?isStarred?in self.collectionView.reloadItemsAtIndexPaths([?indexPath?]) }

這是處理點擊一個集合視圖單元格上的愛心按鈕的閉包,這就是產(chǎn)生循環(huán)引用的問題的地方,但這很難發(fā)現(xiàn),除非你之前遇到過這種情況。

Cell閉包通過self引用SearchResultsViewController,從而產(chǎn)生了一個強引用。實際上swift強制你在閉包中使用self(然而在指代當前對象的屬性和方法時你通常可以省略它),這有助于加深你對正在捕獲self這一事實的認識。通過集合視圖,SearchResultsViewController也對這些cell持有強引用。

為了打破強引用環(huán),你可以定義一個捕獲列表(capture list)作為閉包定義的一部分,捕獲列表可以用來聲明實例,這些實例被閉包捕獲時或者是weak,或者是unowned:

  • weak:當捕獲的引用在以后可能會變成nil時使用,如果引用的對象被釋放,引用變量自動變成nil。因此,這些變量都是可選類型。

  • Unowned:當被引用的對象和閉包擁有相同的生命周期并且會被同時釋放時使用,一個unowned變量永遠不可能是nil。

要解決這個強引用環(huán)問題,再次點擊Open in Xcode按鈕,然后在SearchResultsViewController.swift的heartToggleHandler中添加捕獲列表:

1 2 3 4 5 cell.heartToggleHandler?=?{?[weak?self]?isStarred?in if?let?strongSelf?=?self?{ strongSelf.collectionView.reloadItemsAtIndexPaths([?indexPath?]) } }

把self聲明為weak說明SearchResultsViewController可能被釋放,即使集合視圖的cell持有它的一個引用。因為現(xiàn)在它們之間的引用僅僅是弱引用。并且SearchResultsViewController的釋放也會引起集合視圖的釋放,接著,cell釋放。

在Xcode中,再次使用commond+I在Instrument中編譯并運行app。

和之前做的一樣,在Instruments中,再次使用Allocations工具觀察app(記住要篩選結(jié)果,只顯示屬于我們的示例工程部分的類)。執(zhí)行一次搜索,導(dǎo)航到結(jié)果中,然后再次返回。可以看到這次當你導(dǎo)航返回時SearchResultsViewController和它的cell都被釋放了。它們現(xiàn)在是臨時對象,而不是持久對象。循環(huán)打破!再一次跨越!:]

何去何從?

從這里下載工程的最終優(yōu)化版本,全都多虧了Instruments。

既然你已經(jīng)掌握了這些知識,去分析自己的代碼然后看一下有什么有趣的事情發(fā)生吧。同時,試著將分析應(yīng)用作為你平常開發(fā)工作流中的一個環(huán)節(jié)。

你應(yīng)該經(jīng)常通過Instruments來運行你的代碼,并在發(fā)布之前對你的app進行一次徹底的清理,以確保你已經(jīng)盡可能多地找到了內(nèi)存管理問題和性能問題。

現(xiàn)在去做一些優(yōu)秀并且高效的app吧!:]

轉(zhuǎn)載于:https://my.oschina.net/are1OfBlog/blog/474926

總結(jié)

以上是生活随笔為你收集整理的如何使用Instruments诊断App(Swift版):起步的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

免费看黄在线观看 | 国产精品99视频 | 日韩sese | 美女福利视频在线 | 色姑娘综合网 | 在线视频婷婷 | 91麻豆精品一区二区三区 | 精品在线亚洲视频 | 日韩精品中文字幕在线 | www.在线观看av | 精品视频在线看 | 九九精品久久 | 日韩在线视频观看免费 | 日韩小视频 | 激情综合网在线观看 | 九九涩涩av台湾日本热热 | 日韩一二三区不卡 | 激情视频免费在线 | 国产小视频在线免费观看 | 亚洲经典视频在线观看 | 美国av片在线观看 | 国产精品久久麻豆 | 嫩草av在线 | 三级黄色片在线观看 | 特级a老妇做爰全过程 | 国产欧美精品在线观看 | 国产精品高清在线 | 成人国产精品久久久久久亚洲 | 免费视频 你懂的 | 日本中文字幕网址 | 色精品视频 | 国模视频一区二区三区 | 精品九九九 | 久久久综合九色合综国产精品 | 日韩国产在线观看 | 日韩精品你懂的 | 欧美色婷| www国产精品com | 91精品视频在线免费观看 | 婷婷综合在线 | 婷婷av资源 | 婷婷六月久久 | 国产精品麻豆99久久久久久 | 成人黄色小说视频 | 久久免费电影网 | 91久久国产露脸精品国产闺蜜 | 黄www在线观看 | 狠狠狠色丁香综合久久天下网 | 免费观看日韩av | 亚洲人成精品久久久久 | 97日日碰人人模人人澡分享吧 | 中文字幕资源网 国产 | 免费在线观看一级片 | 看av在线 | 欧美国产高清 | 国产精品一区二区久久久久 | 最新国产一区二区三区 | 香蕉视频在线免费 | 国产精品视频久久久 | 久久久久久久久久久黄色 | 97视频中文字幕 | 精品国产免费av | 99精品视频中文字幕 | 国产成人精品一区二区在线 | 久久久午夜视频 | 欧美另类激情 | 日韩婷婷 | 在线播放第一页 | 亚洲免费激情 | 91九色视频在线观看 | 久久久在线免费观看 | 日本韩国精品一区二区在线观看 | 久久久久高清毛片一级 | 亚洲成人一二三 | 99精品在线视频观看 | 亚洲精品在线一区二区三区 | 国产成人三级在线观看 | 91麻豆精品一区二区三区 | 高清一区二区 | 久久久亚洲麻豆日韩精品一区三区 | 韩国av免费| 国产一区二区精品久久91 | 丁香婷婷自拍 | 在线观看中文字幕2021 | 一区二区三区日韩视频在线观看 | 午夜在线免费观看 | 91超碰在线播放 | 国产精品久久久久久久久久免费看 | 国产精品中文久久久久久久 | 中文字幕在线观看第一页 | 国产999视频| 一区二区精品国产 | 国产 成人 久久 | 欧美日韩视频在线观看免费 | 国内精品久久久久久久影视麻豆 | 91麻豆免费版 | 天天色播 | 在线一二三区 | 午夜精品久久久久久久99婷婷 | 99精品欧美一区二区三区黑人哦 | 综合久久网 | 黄色软件在线观看 | 亚洲va在线va天堂 | 三级黄色大片在线观看 | 亚洲天堂网在线观看视频 | 国产最新在线 | 人人操日日干 | 人人干人人上 | 欧美精品在线观看免费 | 欧洲激情在线 | 国产成人免费精品 | 亚洲精品国产自产拍在线观看 | 精品亚洲视频在线观看 | 美女免费网站 | 国产精品久久久久999 | 日韩久久一区 | 韩国三级在线一区 | 激情五月av | 久久精品美女 | 精品中文字幕视频 | 中文字幕资源在线观看 | www成人av | 五月天欧美精品 | 天天干 天天摸 天天操 | 91cn国产在线 | 观看免费av| 久久国产经典视频 | av网站在线免费观看 | 综合色在线观看 | 欧美在线观看视频一区二区 | 丰满少妇对白在线偷拍 | 色婷婷久久久综合中文字幕 | 中文字幕你懂的 | 99精品国自产在线 | 久久96| 欧美日韩视频精品 | 欧美成人精品欧美一级乱 | 日韩理论在线播放 | 91福利视频一区 | 国产精品国产三级国产aⅴ无密码 | 丁香综合av | 日韩成人看片 | 久久久www成人免费精品张筱雨 | 国产一级二级三级在线观看 | 国产视频手机在线 | 亚洲精品91天天久久人人 | 丁香六月五月婷婷 | 色婷婷av一区 | 欧美精品久久 | 色婷婷国产精品一区在线观看 | 日韩欧美高清一区二区三区 | 亚洲精品在线观看av | 国产精品成人一区二区 | 91在线精品观看 | 国产在线日本 | caobi视频| 天天操天天操天天操天天操天天操天天操 | 一本一本久久a久久精品综合妖精 | 亚洲最新在线 | 午夜精品久久久久久久久久 | 特级西西www44高清大胆图片 | 91av免费在线观看 | 18+视频网站链接 | 成人在线视频在线观看 | 2019精品手机国产品在线 | 国产九九九视频 | www日韩在线| 婷婷国产v亚洲v欧美久久 | www.国产在线观看 | 欧美成人xxxx| 国产va在线 | 黄色免费在线看 | 色网站在线| 夜夜躁日日躁狠狠久久88av | 色av男人的天堂免费在线 | 久久亚洲福利视频 | 不卡的av在线播放 | 日本不卡123区 | 色综合久久久久网 | 欧美日韩二区在线 | 精品美女久久久久久免费 | 欧美analxxxx| 亚洲激情网站免费观看 | 日韩av在线一区二区 | 国产69精品久久99不卡的观看体验 | 国产精品精品久久久久久 | 亚洲一二三久久 | 三级黄色大片在线观看 | 亚洲天堂网在线视频 | 高清av在线免费观看 | 久久久久久美女 | 6699私人影院 | 又色又爽又黄高潮的免费视频 | 婷婷资源站 | 91九色蝌蚪视频 | japanesexxxxfreehd乱熟 | 精品麻豆入口免费 | 国产精品第一页在线 | 在线观看亚洲成人 | 免费在线观看亚洲视频 | 伊人国产在线播放 | 狠狠狠狠狠狠狠狠 | 999国产 | 东方av在线免费观看 | 婷婷色六月天 | 亚洲香蕉在线观看 | 四虎在线免费观看 | 欧美国产日韩在线视频 | 黄av免费在线观看 | 欧美污污网站 | 91高清视频| 久久av在线播放 | 人人舔人人| 精品一区 精品二区 | 91爱爱网址| 国产精品毛片久久久久久 | 亚洲九九九| 91视频免费看 | 日韩精品视 | 综合网伊人 | 天堂av在线7 | 国产精品久久久久久久久大全 | 成人精品电影 | 五月婷婷激情综合网 | 日韩动态视频 | 亚洲一级黄色片 | 狠狠搞,com | 在线观看中文字幕dvd播放 | 日韩精品视频免费专区在线播放 | 日韩视频在线播放 | 91精品在线视频观看 | 免费精品在线视频 | 天海翼一区二区三区免费 | 中文国产成人精品久久一 | 亚洲黄色大片 | 成人久久综合 | 亚洲精品欧美成人 | 91女子私密保健养生少妇 | av在线免费在线 | 国内精品久久久精品电影院 | 天天色天天艹 | 99精品黄色片免费大全 | 超碰在线97观看 | 中文字幕乱在线伦视频中文字幕乱码在线 | 91精品视频免费看 | 美国av大片 | 蜜臀91丨九色丨蝌蚪老版 | 国色天香在线观看 | 国产麻豆精品久久一二三 | 国产伦理久久精品久久久久_ | av在线播放国产 | 九九免费精品视频在线观看 | 九九热免费在线视频 | 亚洲精品久久久久999中文字幕 | 久久精品欧美一区 | 黄色影院在线播放 | av在线免费不卡 | 久久国产精品99久久久久久丝袜 | 一区二区激情视频 | 丝袜足交在线 | 日本成人黄色片 | 中文字幕国产亚洲 | 日本午夜在线观看 | 天天天天综合 | 国产无套精品久久久久久 | aaa毛片视频 | 精品国内自产拍在线观看视频 | 亚洲高清视频在线观看免费 | 久久久久国产精品厨房 | 97成人在线免费视频 | 九九综合在线 | 国产精品1区 | 国产日韩亚洲 | 97超碰在线久草超碰在线观看 | 中文在线资源 | 久9在线| 国产网红在线观看 | 日韩视频中文字幕 | 激情视频区 | 日本激情中文字幕 | 一区二区 精品 | 国产精品美女免费看 | 一区二区精品视频 | 欧美少妇xxx | 天天色天天爱天天射综合 | 伊人影院99| 草久视频在线观看 | 国产一级精品视频 | 高清中文字幕 | 久久久精品午夜 | 国产污视频在线观看 | 欧美日本不卡视频 | 四虎4hu永久免费 | 国产无套精品久久久久久 | 日批视频在线观看免费 | av+在线播放在线播放 | 在线天堂视频 | 日韩欧美视频在线播放 | 亚洲资源| 亚洲精品xxx | 狠狠狠狠狠狠干 | 亚洲在线视频网站 | 天天综合视频在线观看 | 色妞色视频一区二区三区四区 | 果冻av在线 | 国产精品成人国产乱 | 2019中文最近的2019中文在线 | 美女网站视频色 | 欧美成人亚洲成人 | 日本中文字幕影院 | 天天综合狠狠精品 | 欧美日韩观看 | 91pony九色丨交换 | 欧美另类高潮 | 99热手机在线 | 91欧美日韩国产 | av福利在线播放 | 五月天婷婷视频 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 91在线在线观看 | av五月婷婷 | 欧美日韩午夜 | 中文字幕之中文字幕 | www免费网站在线观看 | 天天射综合网视频 | 99热99热 | 99久e精品热线免费 99国产精品久久久久久久久久 | 欧美日韩中文在线视频 | 日韩动态视频 | 九九欧美 | 黄色电影小说 | 国产精品21区 | 久草97| 免费黄色在线网址 | 一本一道久久a久久精品蜜桃 | 天天操天天爱天天爽 | 成人av免费电影 | 最近在线中文字幕 | 69av视频在线观看 | 日韩特级黄色片 | 久久久久免费电影 | 国产98色在线 | 日韩 | 亚洲精品无 | 国际精品久久久 | 96国产精品| 日本黄色大片儿 | 久久久精品亚洲 | 黄色av大片 | 国产成人精品一区二区三区免费 | 成人资源在线播放 | 成人小视频在线播放 | 欧美精品在线一区二区 | av片在线观看 | 久久久久久高潮国产精品视 | 综合色中文 | 国产又粗又猛又黄又爽 | 国产精品成人一区二区三区吃奶 | 四虎小视频 | 91免费观看视频网站 | 国产精品久久网站 | 久久精品国产精品亚洲 | 波多野结衣视频网址 | 久久神马影院 | 色视频在线看 | 在线观看黄色av | 国产亚洲精品综合一区91 | 精品一区电影 | 日韩美女高潮 | 亚洲爱爱视频 | 91久久精品一区二区二区 | 成人性生交视频 | 人人盈棋牌 | 日本中文字幕网 | 狠狠色丁香婷婷综合久小说久 | 日韩精品你懂的 | 三三级黄色片之日韩 | 91最新视频在线观看 | 国产精品免费久久久久 | 黄色网址在线播放 | 成人免费xxx在线观看 | 国产视频精品视频 | 日韩网站免费观看 | 色噜噜日韩精品欧美一区二区 | 亚洲精品乱码久久久久久蜜桃不爽 | 蜜桃av久久久亚洲精品 | 91看片在线观看 | 不卡的av在线 | 激情婷婷久久 | 日本爽妇网 | 亚洲撸撸| 免费一级片久久 | 1024手机基地在线观看 | 成人亚洲网 | 一区二区三区四区五区在线视频 | 91最新在线观看 | 中文字幕在线第一页 | 久久久久久久国产精品影院 | 一区二区三区日韩在线 | 久久精品日韩 | 美腿丝袜一区二区三区 | 91在线小视频 | 国产精品一区二区 91 | 最新一区二区三区 | 国产精品福利在线 | 免费成人黄色 | 国产a网站 | 日韩av偷拍 | 亚洲国产午夜 | 在线免费高清视频 | 四虎影院在线观看av | 最近2019好看的中文字幕免费 | 久久精品一二三 | 日韩精品久久一区二区 | 久久亚洲综合国产精品99麻豆的功能介绍 | 香蕉在线视频播放网站 | 四虎影视成人永久免费观看视频 | 超碰在线1 | 精品国产一区二区三区四区在线观看 | 久久九九影院 | 亚洲精品小区久久久久久 | 热热热热热色 | 欧美激情片在线观看 | 久久av中文字幕片 | 五月婷婷一区 | 久久成人人人人精品欧 | 久久在现 | 亚洲国内在线 | 久久96 | 九九免费视频 | 一区二区激情视频 | 色视频在线免费观看 | 涩五月婷婷 | 欧美精品少妇xxxxx喷水 | 久草精品视频在线播放 | 天天夜操 | 久久免费在线观看视频 | 亚洲视频一| 亚洲女人天堂成人av在线 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 久久久久免费精品国产 | 成人av影院在线观看 | 免费日韩 精品中文字幕视频在线 | 亚洲人天堂| 一区二区视频欧美 | 黄网站www | 欧美日韩精品久久久 | 久久综合五月 | 激情久久伊人 | 久久精品国产一区二区三区 | 97视频网址 | 免费看成年人 | 在线观看免费日韩 | 在线播放精品一区二区三区 | 国内丰满少妇猛烈精品播放 | 九九免费视频 | 成年人黄色免费视频 | 日韩在线中文字幕 | 亚洲精品视频免费看 | 超碰午夜 | 欧美视频网址 | 麻豆精品视频在线观看免费 | 91精品国产乱码 | 91色综合 | 97超碰伊人 | 久久久久久久久久久久av | 在线观看视频黄色 | 91污视频在线 | 久久久国产一区二区三区四区小说 | 国产精品久久久久一区二区国产 | 国产97色 | 精品视频网站 | 成人三级网址 | 欧美成人aa| 天天插天天色 | 91福利区一区二区三区 | 免费国产一区二区 | 久久久久伦理电影 | 九九九视频精品 | se视频网址 | 成人久久精品视频 | 亚洲精品一区二区18漫画 | 成人毛片在线观看 | 一区二区电影在线观看 | 麻豆国产网站 | 国产自偷自拍 | 亚洲午夜在线视频 | 视频在线一区 | 亚州成人av在线 | 天天夜夜狠狠操 | a在线观看视频 | 国产精品综合久久久 | 91亚洲综合 | 亚洲日本一区二区在线 | 狠狠色丁香久久婷婷综合五月 | 美女视频久久久 | 日产乱码一二三区别在线 | 91大神视频网站 | 久久私人影院 | www.香蕉视频在线观看 | 午夜精品一区二区三区可下载 | 国产日韩在线视频 | 日韩av成人在线 | 亚洲国产成人精品久久 | 久黄色 | 一级黄色电影网站 | 性色视频在线 | 日韩欧美一区二区三区在线 | 九九免费在线观看 | 在线视频国产区 | 99热精品国产 | 国产录像在线观看 | 久久中国精品 | 三级av在线免费观看 | 成人毛片100免费观看 | 国产精品中文久久久久久久 | 成人黄色免费观看 | 成人综合免费 | 久久香蕉影视 | 日韩在线看片 | 在线免费黄色片 | 国产精品久久久久久久久久久久午夜片 | 国产亚洲精品久久久久久网站 | 国产精品免费一区二区三区 | 日韩专区中文字幕 | 久久久香蕉视频 | 狠狠狠狠狠狠狠狠干 | avwww在线| 亚洲春色综合另类校园电影 | 国产精品久久久久久久久费观看 | 亚洲综合成人婷婷小说 | 99热最新 | 久久艹国产 | japanesefreesex中国少妇 | 黄色电影网站在线观看 | 九九九九九九精品 | 天天操夜夜逼 | 久久不射影院 | 在线观看黄色av | 不卡国产视频 | 在线免费观看黄色 | 丁香电影小说免费视频观看 | 久久成人一区二区 | 黄色小网站在线观看 | 久久观看最新视频 | 亚洲精品免费在线 | 久久99亚洲精品久久久久 | 99久久这里有精品 | 亚洲欧美视频网站 | 色一色在线 | 久久久麻豆精品一区二区 | 欧美日韩三级在线观看 | 黄色网址av| 99精品小视频 | 成人在线网站观看 | 日韩在线观看第一页 | 人人爽人人爽人人片av | 国产精品一区二区免费看 | 天天操天天插 | 深夜免费小视频 | 奇米先锋| 午夜av免费| 国产精品短视频 | 欧美视频在线二区 | 欧美一区二视频在线免费观看 | 国产黄色片一级 | 亚洲午夜精品久久久久久久久久久久 | 久久亚洲精品国产亚洲老地址 | 免费av 在线| 日韩成人一级大片 | 欧美激情综合五月色丁香 | 国产三级精品三级在线观看 | 国产成人黄色片 | 五月综合婷 | 日韩高清不卡在线 | www亚洲一区| 免费电影一区二区三区 | 91麻豆高清视频 | 国产免费久久精品 | 91视频在线国产 | 精品国产乱码一区二区三区在线 | av在线播放观看 | 精品国产伦一区二区三区观看体验 | 又色又爽又黄高潮的免费视频 | 伊人久久五月天 | 91九色视频 | 国产成人在线观看 | 91在线91| 精品国内自产拍在线观看视频 | 久久久久久久久久久久国产精品 | 美女久久久久久 | 综合在线观看色 | 日韩午夜高清 | 99精品影视 | 中文字幕日韩精品有码视频 | 美女国产精品 | 又黄又爽又刺激 | 黄视频网站大全 | av在线影视 | 国产精品久久久99 | 国产 日韩 在线 亚洲 字幕 中文 | 99 视频 高清 | 国产一级电影在线 | 蜜臀aⅴ国产精品久久久国产 | 欧美久久久一区二区三区 | 欧美精品一二 | 美国av大片 | 国产高清在线精品 | 日韩黄色大片在线观看 | 日韩中文字幕在线看 | 东方av在线免费观看 | 欧美日韩亚洲国产一区 | 精品国产三级 | 999电影免费在线观看2020 | 九热在线 | 日韩精品亚洲专区在线观看 | 成年人免费电影 | 成人在线视频论坛 | 日韩av播放在线 | 激情自拍av| 免费观看黄色12片一级视频 | 欧美午夜精品久久久久 | 日韩三级免费观看 | 四虎影视8848dvd | 天天综合天天做天天综合 | 中文乱幕日产无线码1区 | 精品一区二区在线免费观看 | 肉色欧美久久久久久久免费看 | 伊人六月 | 99久久国产免费免费 | 日韩视频精品在线 | 国产99久久久国产精品成人免费 | 99久久精品费精品 | 中文在线最新版天堂 | 色99久久 | 中文字幕av在线播放 | 久久精品一二三区 | 一区二区三区免费在线播放 | 亚洲精品一区二区三区新线路 | 日韩欧美视频一区二区三区 | 欧美精品黑人性xxxx | 狠狠干狠狠色 | 丁香花在线视频观看免费 | 久草视频免费播放 | 狠狠躁日日躁夜夜躁av | 久热超碰| 永久免费观看视频 | 久久三级视频 | 免费麻豆视频 | 国产精品久久久久婷婷二区次 | 亚洲视频,欧洲视频 | 激情欧美丁香 | 久久国产一区二区三区 | 日韩成人在线免费观看 | 亚洲一级片在线观看 | 这里只有精品视频在线 | 国产美女在线精品免费观看 | 三级在线视频观看 | 一区中文字幕 | 97**国产露脸精品国产 | 国产999精品久久久久久绿帽 | 狠狠狠色丁香综合久久天下网 | 亚洲精品视频在线观看网站 | 国产精品麻豆99久久久久久 | 91在线视频播放 | 91九色国产| 日韩免费电影网站 | 午夜在线看片 | 不卡中文字幕av | 五月激情视频 | 国产成人精品999 | 天天操夜夜想 | 一区二区视频电影在线观看 | 一级黄色片在线播放 | 五月网婷婷 | 在线观看中文 | 人人看看人人 | 久久综合婷婷国产二区高清 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 97色se| 欧洲成人av| 国产露脸91国语对白 | 亚洲精品乱码久久久久久9色 | 99精品视频免费 | 久草视频免费在线观看 | 人人爽人人 | 亚洲视频 在线观看 | 四虎欧美 | 欧美日韩不卡在线观看 | 国产精品第 | 播五月婷婷 | 黄色软件在线观看 | 亚洲精色| av高清不卡| 久热这里有精品 | 日韩精品资源 | 日韩av女优视频 | 欧美综合在线观看 | 国产精品完整版 | 亚洲理论影院 | 亚洲一区二区三区在线看 | 久草精品网 | 在线观看日韩国产 | 三级黄色网址 | 日韩综合一区二区三区 | 视频成人永久免费视频 | 日韩在线不卡av | 亚洲撸撸| 日韩欧美精品在线视频 | 久草在线这里只有精品 | 97精品久久人人爽人人爽 | 国产黄色片久久 | 一区二区三区久久 | 天堂av在线 | 午夜久草 | 国内综合精品午夜久久资源 | 亚洲欧洲国产精品 | 成人宗合网 | 狠狠色丁香婷婷综合久久片 | 国产成人香蕉 | 国产精品麻豆三级一区视频 | 亚洲人天堂 | 在线观看视频免费大全 | 三日本三级少妇三级99 | av一区二区三区在线 | 日p视频在线观看 | 久久极品 | 日韩视频一二三区 | 国产视频第二页 | 成人午夜电影免费在线观看 | 成人免费 在线播放 | 黄色99视频 | 九九精品视频在线看 | 国产一区二区视频在线播放 | 综合av在线 | 日韩一区二区三区观看 | 人人澡人人爱 | 特级毛片爽www免费版 | 日本中文字幕高清 | 99久久精品免费看国产四区 | 国产a级免费 | 91插插插网站 | 国产成人精品一区二区三区福利 | 在线视频 区 | 国产精品婷婷午夜在线观看 | 精品久久在线 | 色婷婷综合久久久中文字幕 | 亚洲精品免费在线观看视频 | 色偷偷88888欧美精品久久久 | 日韩在线播放av | www视频免费在线观看 | 中文字幕免费高清在线 | 玖玖在线播放 | 日韩在线播放欧美字幕 | 激情五月婷婷 | 午夜av大片| 91精品综合在线观看 | 亚洲免费观看在线视频 | 精品久久久久久久久久久久久 | 91麻豆国产| 天天操天天干天天摸 | 久久视影 | 亚洲 综合 专区 | 狠狠躁夜夜躁人人爽超碰91 | 天天摸天天弄 | 中文字幕国产 | 一区二区三区手机在线观看 | 人人dvd| 久久激情综合网 | 国产裸体视频网站 | 国产精品手机在线观看 | 午夜精品久久久久 | 亚洲精品欧美精品 | 国产成人福利在线 | 天天干天天操天天爱 | 久久免费在线视频 | 91人人揉日日捏人人看 | 国内亚洲精品 | 国产精品2020 | 中文字幕在线观看网站 | 成人国产精品电影 | 天天色天天骑天天射 | 国产精品免费一区二区三区在线观看 | 91网站观看| 天天干天天做 | 日本精品视频在线 | 久久精品看片 | 操操操天天操 | 欧美一二三区播放 | 日韩 精品 一区 国产 麻豆 | av免费观看高清 | 色吧久久 | 日日天天av | 国产资源| 人人爽人人做 | 欧美超碰在线 | 久久人人爽人人爽人人片av软件 | 久久精品视频播放 | 人九九精品 | 国产精品高清一区二区三区 | 日韩精品视频免费专区在线播放 | 四虎影视www | 久久久久夜色 | 亚洲经典在线 | 欧美色久 | 五月综合激情网 | 一区二区三区在线视频观看58 | 日韩高清一 | 日本精品视频一区二区 | 久久久网 | 免费h漫在线观看 | 91av视频| 久草在线免费资源站 | 日韩激情久久 | 久久在线免费观看视频 | 九九热中文字幕 | 激情丁香综合 | 黄色一级大片免费看 | 成人中文字幕av | 成人av网站在线观看 | 狠狠色丁香婷婷综合久久片 | 久久久久久综合 | www.久久成人 | 天天操天天操 | 探花视频在线观看免费版 | av短片在线 | 99热国产在线观看 | 欧美亚洲精品在线观看 | 欧美精品少妇xxxxx喷水 | 欧洲av在线 | 在线观看视频国产 | 婷婷成人综合 | 国产成人综合在线观看 | 国产欧美精品一区二区三区 | 亚洲国产成人精品在线 | 国产v欧美 | 狠狠色噜噜狠狠 | 波多野结衣电影一区二区三区 | 又爽又黄又无遮挡网站动态图 | 四虎成人精品永久免费av | 婷婷丁香久久五月婷婷 | 射久久久 | av成人黄色 | 日韩三级成人 | 国产精品99免费看 | 国产精品对白一区二区三区 | 久久久久久久国产精品影院 | 亚洲男男gaygayxxxgv | 日韩av电影中文字幕在线观看 | 国产美女被啪进深处喷白浆视频 | 婷婷 综合 色 | 极品久久久 | 在线日韩av | 成人免费共享视频 | 婷婷激情五月综合 | 九九免费在线观看 | 久久亚洲福利视频 | 九九综合久久 | 亚洲综合小说电影qvod | 亚洲欧洲精品一区 | 欧美性生活大片 | 99久久精品日本一区二区免费 | 午夜久久久影院 | 欧洲视频一区 | avhd高清在线谜片 | 久久免费99精品久久久久久 | av黄色av | 人人要人人澡人人爽人人dvd | 亚洲国产精品视频 | 麻豆影视在线免费观看 | av天天干| 日韩网站在线看片你懂的 | 国产日产精品一区二区三区四区的观看方式 | 欧美一级在线 | 亚洲精品综合在线观看 | 伊人婷婷色| 五月天激情综合 | 在线观看黄污 | 日日夜夜天天久久 | www.com久久 | 成年人在线免费看视频 | 99久久99热这里只有精品 | 安徽妇搡bbbb搡bbbb | 欧美做受高潮1 | 日韩在线电影一区二区 | 成人在线视频观看 | 精品av在线播放 | 一区二区三区视频网站 | 91高清完整版在线观看 | 国产男女无遮挡猛进猛出在线观看 | 国产最顶级的黄色片在线免费观看 | 亚洲黄色在线观看 | 夜夜视频资源 | 国产精品一区久久久久 | 成人污视频在线观看 | 91免费看黄色| 日韩在线观看av | 国产精品欧美日韩 | 天天狠狠干 | 久久国产精品免费一区二区三区 | 日日碰狠狠躁久久躁综合网 | 日本特黄一级 | 国产高清久久久 | 久久精品网站视频 | 黄色在线观看污 | 三级黄色在线 | 麻豆国产精品一区二区三区 | 国产精品久久久久久久午夜 | 欧美日产一区 | 精品国产伦一区二区三区观看说明 | 天天干,天天草 | 亚洲美女在线国产 | 国内小视频在线观看 | 日韩av视屏在线观看 | 日日干视频 | 国产日本亚洲高清 | 亚洲三级黄 | 超碰大片| 日韩啪啪小视频 | 日本精品一 | 在线导航av | 99精品国产免费久久久久久下载 | 丁香婷婷亚洲 | 小草av在线播放 | 一区二区视频在线看 | 精品国产大片 | 黄色一级影院 | 国产美女视频 | 久久综合九色99 | 久久久999精品视频 国产美女免费观看 | 88av视频| 精品一区二区影视 | 久久精品福利视频 | 五月综合 | 麻豆视频网址 | a视频在线 | 亚洲91av| 久久久久久久久久久免费 | 在线亚洲人成电影网站色www | 97超碰成人在线 | 天天射天天干天天爽 | 久久久在线视频 | 日韩黄色一区 | 久久99偷拍视频 | 最新的av网站 | 天天色欧美 | 久久麻豆视频 | 久久精品福利视频 | 很黄很污的视频网站 | 四虎影视精品 | 中文字幕av在线电影 | 婷婷丁香六月天 | 国产美女无遮挡永久免费 | 草久在线播放 | 国产黄色看片 | 日日躁天天躁 | 久草在线久 | 亚洲好视频 | 91色一区二区三区 | 国产国语在线 | 911香蕉 | 国产精成人品免费观看 | 黄网站色成年免费观看 | 99精品久久只有精品 | 超碰在线成人 | 免费的国产精品 | 久久国产视频网站 | 人人射人人 | 免费看搞黄视频网站 | 色综合久久88色综合天天6 | 日本视频高清 | 久久精品黄 | 久久午夜精品影院一区 | 国产剧情av在线播放 | 亚洲国产三级在线 | 国产精品国产三级国产aⅴ无密码 | 一区二区三区在线视频观看58 | 国产精品久久久久久久久久久久午 | 日韩欧美网址 | 成人羞羞视频在线观看免费 | 婷婷亚洲综合 | 99草在线视频 | 天天摸天天操天天爽 | 一级全黄毛片 | 黄色在线免费观看网站 | 国产黄色av | 69精品人人人人 | 国产亚洲综合在线 | 天堂资源在线观看视频 | 天天操夜夜摸 | 欧美伦理电影一区二区 | 狠狠色噜噜狠狠狠狠2021天天 | 国产亚洲人成网站在线观看 | 日韩在线视频播放 | 欧美成人一二区 | 热re99久久精品国产99热 | 成人av免费在线观看 | 久久社区视频 | 国产二级视频 |