精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

理解iOS的內(nèi)存管理

移動(dòng)開發(fā) iOS
我們每一個(gè) iOS 開發(fā)者,需要理解引用計(jì)數(shù)這種內(nèi)存管理方式,只有這樣,才能處理好內(nèi)存管理相關(guān)的問題。

遠(yuǎn)古時(shí)代的故事

那些經(jīng)歷過手工管理內(nèi)存(MRC)時(shí)代的人們,一定對 iOS 開發(fā)中的內(nèi)存管理記憶猶新。那個(gè)時(shí)候大約是 2010 年,國內(nèi) iOS 開發(fā)剛剛興起,tinyfool 大叔的大名已經(jīng)如雷貫耳,而我還是一個(gè)默默無聞的剛畢業(yè)的小子。那個(gè)時(shí)候的 iOS 開發(fā)過程是這樣的:

我們先寫好一段 iOS 的代碼,然后屏住呼吸,開始運(yùn)行它,不出所料,它崩潰了。在 MRC 時(shí)代,即使是最牛逼的 iOS 開發(fā)者,也不能保證一次性就寫出完美的內(nèi)存管理代碼。于是,我們開始一步一步調(diào)試,試著打印出每個(gè)懷疑對象的引用計(jì)數(shù)(Retain Count),然后,我們小心翼翼地插入合理的 retain 和 release 代碼。經(jīng)過一次又一次的應(yīng)用崩潰和調(diào)試,終于有一次,應(yīng)用能夠正常運(yùn)行了!于是我們長舒一口氣,露出久違的微笑。

是的,這就是那個(gè)年代的 iOS 開發(fā)者,通常情況下,我們在開發(fā)完一個(gè)功能后,需要再花好幾個(gè)小時(shí),才能把引用計(jì)數(shù)管理好。

蘋果在 2011 年的時(shí)候,在 WWDC 大會(huì)上提出了自動(dòng)的引用計(jì)數(shù)(ARC)。ARC 背后的原理是依賴編譯器的靜態(tài)分析能力,通過在編譯時(shí)找出合理的插入引用計(jì)數(shù)管理代碼,從而徹底解放程序員。

在 ARC 剛剛出來的時(shí)候,業(yè)界對此黑科技充滿了懷疑和觀望,加上現(xiàn)有的 MRC 代碼要做遷移本來也需要額外的成本,所以 ARC 并沒有被很快接受。直到 2013 年左右,蘋果認(rèn)為 ARC 技術(shù)足夠成熟,直接將 macOS(當(dāng)時(shí)叫 OS X)上的垃圾回收機(jī)制廢棄,從而使得 ARC 迅速被接受。

2014 年的 WWDC 大會(huì)上,蘋果推出了 Swift 語言,而該語言仍然使用 ARC 技術(shù),作為其內(nèi)存管理方式。

為什么我要提這段歷史呢?就是因?yàn)楝F(xiàn)在的 iOS 開發(fā)者實(shí)在太舒服了,大部分時(shí)候,他們根本都不用關(guān)心程序的內(nèi)存管理行為。但是,雖然 ARC 幫我們解決了引用計(jì)數(shù)的大部分問題,一些年輕的 iOS 開發(fā)者仍然會(huì)做不好內(nèi)存管理工作。他們甚至不能理解常見的循環(huán)引用問題,而這些問題會(huì)導(dǎo)致內(nèi)存泄漏,最終使得應(yīng)用運(yùn)行緩慢或者被系統(tǒng)終止進(jìn)程。

所以,我們每一個(gè) iOS 開發(fā)者,需要理解引用計(jì)數(shù)這種內(nèi)存管理方式,只有這樣,才能處理好內(nèi)存管理相關(guān)的問題。

什么是引用計(jì)數(shù)

引用計(jì)數(shù)(Reference Count)是一個(gè)簡單而有效的管理對象生命周期的方式。當(dāng)我們創(chuàng)建一個(gè)新對象的時(shí)候,它的引用計(jì)數(shù)為 1,當(dāng)有一個(gè)新的指針指向這個(gè)對象時(shí),我們將其引用計(jì)數(shù)加 1,當(dāng)某個(gè)指針不再指向這個(gè)對象是,我們將其引用計(jì)數(shù)減 1,當(dāng)對象的引用計(jì)數(shù)變?yōu)?0 時(shí),說明這個(gè)對象不再被任何指針指向了,這個(gè)時(shí)候我們就可以將對象銷毀,回收內(nèi)存。由于引用計(jì)數(shù)簡單有效,除了 Objective-C 和 Swift 語言外,微軟的 COM(Component Object Model )、C++11(C++11 提供了基于引用計(jì)數(shù)的智能指針 share_prt)等語言也提供了基于引用計(jì)數(shù)的內(nèi)存管理方式。 

 

 

 

為了更形象一些,我們再來看一段 Objective-C 的代碼。新建一個(gè)工程,因?yàn)楝F(xiàn)在默認(rèn)的工程都開啟了自動(dòng)的引用計(jì)數(shù) ARC(Automatic Reference Count),我們先修改工程設(shè)置,給 AppDelegate.m 加上 -fno-objc-arc 的編譯參數(shù)(如下圖所示),這個(gè)參數(shù)可以啟用手工管理引用計(jì)數(shù)的模式。 

 

 

 

然后,我們在中輸入如下代碼,可以通過 Log 看到相應(yīng)的引用計(jì)數(shù)的變化。

  1. - (BOOL)application:(UIApplication *)application  
  2.        didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
  3. {     
  4.     NSObject *object = [[NSObject alloc] init];     
  5.     NSLog(@"Reference Count = %u", [object retainCount]); 
  6.     NSObject *another = [object retain]; 
  7.     NSLog(@"Reference Count = %u", [object retainCount]); 
  8.     [another release]; 
  9.     NSLog(@"Reference Count = %u", [object retainCount]); 
  10.     [object release];    // 到這里時(shí),object 的內(nèi)存被釋放了 
  11.     return YES; 
  12.  

運(yùn)行結(jié)果:

  1. Reference Count = 1 
  2. Reference Count = 2 
  3. Reference Count = 1  

對 Linux 文件系統(tǒng)比較了解的同學(xué)可能發(fā)現(xiàn),引用計(jì)數(shù)的這種管理方式類似于文件系統(tǒng)里面的硬鏈接。在 Linux 文件系統(tǒng)中,我們用 ln 命令可以創(chuàng)建一個(gè)硬鏈接(相當(dāng)于我們這里的 retain),當(dāng)刪除一個(gè)文件時(shí)(相當(dāng)于我們這里的 release),系統(tǒng)調(diào)用會(huì)檢查文件的 link count 值,如果大于 1,則不會(huì)回收文件所占用的磁盤區(qū)域。直到最后一次刪除前,系統(tǒng)發(fā)現(xiàn) link count 值為 1,則系統(tǒng)才會(huì)執(zhí)行直正的刪除操作,把文件所占用的磁盤區(qū)域標(biāo)記成未用。

我們?yōu)槭裁葱枰糜?jì)數(shù)

從上面那個(gè)簡單的例子中,我們還看不出來引用計(jì)數(shù)真正的用處。因?yàn)樵搶ο蟮纳谥皇窃谝粋€(gè)函數(shù)內(nèi),所以在真實(shí)的應(yīng)用場景下,我們在函數(shù)內(nèi)使用一個(gè)臨時(shí)的對象,通常是不需要修改它的引用計(jì)數(shù)的,只需要在函數(shù)返回前將該對象銷毀即可。

引用計(jì)數(shù)真正派上用場的場景是在面向?qū)ο蟮某绦蛟O(shè)計(jì)架構(gòu)中,用于對象之間傳遞和共享數(shù)據(jù)。我們舉一個(gè)具體的例子:

假如對象 A 生成了一個(gè)對象 M,需要調(diào)用對象 B 的某一個(gè)方法,將對象 M 作為參數(shù)傳遞過去。在沒有引用計(jì)數(shù)的情況下,一般內(nèi)存管理的原則是 “誰申請誰釋放”,那么對象 A 就需要在對象 B 不再需要對象 M 的時(shí)候,將對象 M 銷毀。但對象 B 可能只是臨時(shí)用一下對象 M,也可能覺得對象 M 很重要,將它設(shè)置成自己的一個(gè)成員變量,那這種情況下,什么時(shí)候銷毀對象 M 就成了一個(gè)難題。 

 

 

 

對于這種情況,有一個(gè)暴力的做法,就是對象 A 在調(diào)用完對象 B 之后,馬上就銷毀參數(shù)對象 M,然后對象 B 需要將參數(shù)另外復(fù)制一份,生成另一個(gè)對象 M2,然后自己管理對象 M2 的生命期。但是這種做法有一個(gè)很大的問題,就是它帶來了更多的內(nèi)存申請、復(fù)制、釋放的工作。本來一個(gè)可以復(fù)用的對象,因?yàn)椴环奖愎芾硭纳冢秃唵蔚陌阉N毀,又重新構(gòu)造一份一樣的,實(shí)在太影響性能。如下圖所示: 

 

 

我們另外還有一種辦法,就是對象 A 在構(gòu)造完對象 M 之后,始終不銷毀對象 M,由對象 B 來完成對象 M 的銷毀工作。如果對象 B 需要長時(shí)間使用對象 M,它就不銷毀它,如果只是臨時(shí)用一下,則可以用完后馬上銷毀。這種做法看似很好地解決了對象復(fù)制的問題,但是它強(qiáng)烈依賴于 AB 兩個(gè)對象的配合,代碼維護(hù)者需要明確地記住這種編程約定。而且,由于對象 M 的申請是在對象 A 中,釋放在對象 B 中,使得它的內(nèi)存管理代碼分散在不同對象中,管理起來也非常費(fèi)勁。如果這個(gè)時(shí)候情況再復(fù)雜一些,例如對象 B 需要再向?qū)ο?C 傳遞對象 M,那么這個(gè)對象在對象 C 中又不能讓對象 C 管理。所以這種方式帶來的復(fù)雜性更大,更不可取。 

 

 

 

所以引用計(jì)數(shù)很好的解決了這個(gè)問題,在參數(shù) M 的傳遞過程中,哪些對象需要長時(shí)間使用這個(gè)對象,就把它的引用計(jì)數(shù)加 1,使用完了之后再把引用計(jì)數(shù)減 1。所有對象都遵守這個(gè)規(guī)則的話,對象的生命期管理就可以完全交給引用計(jì)數(shù)了。我們也可以很方便地享受到共享對象帶來的好處。

不要向已經(jīng)釋放的對象發(fā)送消息

有些同學(xué)想測試當(dāng)對象釋放時(shí),其 retainCount 是否變成了 0,他們的試驗(yàn)代碼如下:

  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
  2. {    NSObject *object = [[NSObject alloc] init];    NSLog(@"Reference Count = %u", [object retainCount]); 
  3.     [object release];    NSLog(@"Reference Count = %u", [object retainCount]);    return YES; 
  4.  

但是,如果你真的這么實(shí)驗(yàn),你得到的輸出結(jié)果可能是以下這樣:

  1. Reference Count = 1 
  2. Reference Count = 1  

我們注意到,最后一次輸出,引用計(jì)數(shù)并沒有變成 0。這是為什么呢?因?yàn)樵搶ο蟮膬?nèi)存已經(jīng)被回收,而我們向一個(gè)已經(jīng)被回收的對象發(fā)了一個(gè) retainCount 消息,所以它的輸出結(jié)果應(yīng)該是不確定的,如果該對象所占的內(nèi)存被復(fù)用了,那么就有可能造成程序異常崩潰。

那為什么在這個(gè)對象被回收之后,這個(gè)不確定的值是 1 而不是 0 呢?這是因?yàn)楫?dāng)最后一次執(zhí)行 release 時(shí),系統(tǒng)知道馬上就要回收內(nèi)存了,就沒有必要再將 retainCount 減 1 了,因?yàn)椴还軠p不減 1,該對象都肯定會(huì)被回收,而對象被回收后,它的所有的內(nèi)存區(qū)域,包括 retainCount 值也變得沒有意義。不將這個(gè)值從 1 變成 0,可以減少一次內(nèi)存的寫操作,加速對象的回收。

拿我們之前提到的 Linux 文件系統(tǒng)舉列,Linux 文件系統(tǒng)下刪除一個(gè)文件,也不是真正的將文件的磁盤區(qū)域進(jìn)行抹除操作,而只是刪除該文件的索引節(jié)點(diǎn)號。這也和引用計(jì)數(shù)的內(nèi)存回收方式類似,即回收時(shí)只做標(biāo)記,并不抹除相關(guān)的數(shù)據(jù)。

ARC 下的內(nèi)存管理問題

ARC 能夠解決 iOS 開發(fā)中 90% 的內(nèi)存管理問題,但是另外還有 10% 內(nèi)存管理,是需要開發(fā)者自己處理的,這主要就是與底層 Core Foundation 對象交互的那部分,底層的 Core Foundation 對象由于不在 ARC 的管理下,所以需要自己維護(hù)這些對象的引用計(jì)數(shù)。

對于 ARC 盲目依賴的 iOS 新人們,由于不知道引用計(jì)數(shù),他們的問題主要體現(xiàn)在:

  1. 過度使用 block 之后,無法解決循環(huán)引用問題。
  2. 遇到底層 Core Foundation 對象,需要自己手工管理它們的引用計(jì)數(shù)時(shí),顯得一籌莫展。

循環(huán)引用(Reference Cycle)問題

引用計(jì)數(shù)這種管理內(nèi)存的方式雖然很簡單,但是有一個(gè)比較大的瑕疵,即它不能很好的解決循環(huán)引用問題。如下圖所示:對象 A 和對象 B,相互引用了對方作為自己的成員變量,只有當(dāng)自己銷毀時(shí),才會(huì)將成員變量的引用計(jì)數(shù)減 1。因?yàn)閷ο?A 的銷毀依賴于對象 B 銷毀,而對象 B 的銷毀與依賴于對象 A 的銷毀,這樣就造成了我們稱之為循環(huán)引用(Reference Cycle)的問題,這兩個(gè)對象即使在外界已經(jīng)沒有任何指針能夠訪問到它們了,它們也無法被釋放。 

 

 

 

不止兩對象存在循環(huán)引用問題,多個(gè)對象依次持有對方,形式一個(gè)環(huán)狀,也可以造成循環(huán)引用問題,而且在真實(shí)編程環(huán)境中,環(huán)越大就越難被發(fā)現(xiàn)。下圖是 4 個(gè)對象形成的循環(huán)引用問題。 

 

 

 

解決循環(huán)引用問題主要有兩個(gè)辦法,第一個(gè)辦法是我明確知道這里會(huì)存在循環(huán)引用,在合理的位置主動(dòng)斷開環(huán)中的一個(gè)引用,使得對象得以回收。如下圖所示: 

 

 

 

主動(dòng)斷開循環(huán)引用這種方式常見于各種與 block 相關(guān)的代碼邏輯中。例如在我們公司開源的 YTKNetwork 網(wǎng)絡(luò)庫中,網(wǎng)絡(luò)請求的回調(diào) block 是被持有的,但是如果這個(gè) block 中又存在對于 View Controller 的引用,就很容易產(chǎn)生從循環(huán)引用,因?yàn)椋?/p>

  • Controller 持有了網(wǎng)絡(luò)請求對象
  • 網(wǎng)絡(luò)請求對象持有了回調(diào)的 block
  • 回調(diào)的 block 里面使用了 self,所以持有了 Controller

解決辦法就是,在網(wǎng)絡(luò)請求結(jié)束后,網(wǎng)絡(luò)請求對象執(zhí)行完 block 之后,主動(dòng)釋放對于 block 的持有,以便打破循環(huán)引用。相關(guān)的代碼見:

  1. // https://github.com/yuantiku/YTKNetwork/blob/master/YTKNetwork/YTKBaseRequest.m 
  2. // 第 147 行: 
  3. - (void)clearCompletionBlock { 
  4.     // 主動(dòng)釋放掉對于 block 的引用 
  5.     self.successCompletionBlock = nil; 
  6.     self.failureCompletionBlock = nil; 
  7.  

不過,主動(dòng)斷開循環(huán)引用這種操作依賴于程序員自己手工顯式地控制,相當(dāng)于回到了以前 “誰申請誰釋放” 的內(nèi)存管理年代,它依賴于程序員自己有能力發(fā)現(xiàn)循環(huán)引用并且知道在什么時(shí)機(jī)斷開循環(huán)引用回收內(nèi)存(這通常與具體的業(yè)務(wù)邏輯相關(guān)),所以這種解決方法并不常用,更常見的辦法是使用弱引用 (weak reference) 的辦法。

弱引用雖然持有對象,但是并不增加引用計(jì)數(shù),這樣就避免了循環(huán)引用的產(chǎn)生。在 iOS 開發(fā)中,弱引用通常在 delegate 模式中使用。舉個(gè)例子來說,兩個(gè) ViewController A 和 B,ViewController A 需要彈出 ViewController B,讓用戶輸入一些內(nèi)容,當(dāng)用戶輸入完成后,ViewController B 需要將內(nèi)容返回給 ViewController A。這個(gè)時(shí)候,View Controller 的 delegate 成員變量通常是一個(gè)弱引用,以避免兩個(gè) ViewController 相互引用對方造成循環(huán)引用問題,如下所示: 

 

 

 

 

使用 Xcode 檢測循環(huán)引用

Xcode 的 Instruments 工具集可以很方便的檢測循環(huán)引用。為了測試效果,我們在一個(gè)測試用的 ViewController 中填入以下代碼,該代碼中的 firstArray 和 secondArray 相互引用了對方,構(gòu)成了循環(huán)引用。

  1. - (void)viewDidLoad 
  2.     [super viewDidLoad]; 
  3.     NSMutableArray *firstArray = [NSMutableArray array]; 
  4.     NSMutableArray *secondArray = [NSMutableArray array]; 
  5.     [firstArray addObject:secondArray]; 
  6.     [secondArray addObject:firstArray]; 
  7.  

在 Xcode 的菜單欄選擇:Product -> Profile,然后選擇 “Leaks”,再點(diǎn)擊右下角的”Profile” 按鈕開始檢測。如下圖 

 

 

 

這個(gè)時(shí)候 iOS 模擬器會(huì)運(yùn)行起來,我們在模擬器里進(jìn)行一些界面的切換操作。稍等幾秒鐘,就可以看到 Instruments 檢測到了我們的這次循環(huán)引用。Instruments 中會(huì)用一條紅色的條來表示一次內(nèi)存泄漏的產(chǎn)生。如下圖所示: 

 

 

我們可以切換到 Leaks 這欄,點(diǎn)擊”Cycles & Roots”,就可以看到以圖形方式顯示出來的循環(huán)引用。這樣我們就可以非常方便地找到循環(huán)引用的對象了。 

 

 

 

Core Foundation 對象的內(nèi)存管理

下面我們就來簡單介紹一下對底層 Core Foundation 對象的內(nèi)存管理。底層的 Core Foundation 對象,在創(chuàng)建時(shí)大多以 XxxCreateWithXxx 這樣的方式創(chuàng)建,例如:

  1. // 創(chuàng)建一個(gè) CFStringRef 對象 
  2. CFStringRef str= CFStringCreateWithCString(kCFAllocatorDefault, “hello world", kCFStringEncodingUTF8); 
  3.  
  4. // 創(chuàng)建一個(gè) CTFontRef 對象 
  5. CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"ArialMT", fontSize, NULL);  

對于這些對象的引用計(jì)數(shù)的修改,要相應(yīng)的使用 CFRetain 和 CFRelease 方法。如下所示:

  1. // 創(chuàng)建一個(gè) CTFontRef 對象 
  2. CTFontRef fontRef = CTFontCreateWithName((CFStringRef)@"ArialMT", fontSize, NULL); 
  3.  
  4. // 引用計(jì)數(shù)加 1 
  5. CFRetain(fontRef); 
  6. // 引用計(jì)數(shù)減 1 
  7. CFRelease(fontRef);  

對于 CFRetain 和 CFRelease 兩個(gè)方法,讀者可以直觀地認(rèn)為,這與 Objective-C 對象的 retain 和 release 方法等價(jià)。

所以對于底層 Core Foundation 對象,我們只需要延續(xù)以前手工管理引用計(jì)數(shù)的辦法即可。

除此之外,還有另外一個(gè)問題需要解決。在 ARC 下,我們有時(shí)需要將一個(gè) Core Foundation 對象轉(zhuǎn)換成一個(gè) Objective-C 對象,這個(gè)時(shí)候我們需要告訴編譯器,轉(zhuǎn)換過程中的引用計(jì)數(shù)需要做如何的調(diào)整。這就引入了bridge相關(guān)的關(guān)鍵字,以下是這些關(guān)鍵字的說明:

  • __bridge: 只做類型轉(zhuǎn)換,不修改相關(guān)對象的引用計(jì)數(shù),原來的 Core Foundation 對象在不用時(shí),需要調(diào)用 CFRelease 方法。
  • __bridge_retained:類型轉(zhuǎn)換后,將相關(guān)對象的引用計(jì)數(shù)加 1,原來的 Core Foundation 對象在不用時(shí),需要調(diào)用 CFRelease 方法。
  • __bridge_transfer:類型轉(zhuǎn)換后,將該對象的引用計(jì)數(shù)交給 ARC 管理,Core Foundation 對象在不用時(shí),不再需要調(diào)用 CFRelease 方法。

我們根據(jù)具體的業(yè)務(wù)邏輯,合理使用上面的 3 種轉(zhuǎn)換關(guān)鍵字,就可以解決 Core Foundation 對象與 Objective-C 對象相對轉(zhuǎn)換的問題了。

總結(jié)

在 ARC 的幫助下,iOS 開發(fā)者的內(nèi)存管理工作已經(jīng)被大大減輕,但是我們?nèi)匀恍枰斫庖糜?jì)數(shù)這種內(nèi)存管理方式的優(yōu)點(diǎn)和常見問題,特別要注意解決循環(huán)引用問題。對于循環(huán)引用問題有兩種主要的解決辦法,一是主動(dòng)斷開循環(huán)引用,二是使用弱引用的方式避免循環(huán)引用。對于 Core Foundation 對象,由于不在 ARC 管理之下,我們?nèi)匀恍枰永m(xù)以前手工管理引用計(jì)數(shù)的辦法。

在調(diào)試內(nèi)存問題時(shí),Instruments 工具可以很好地對我們進(jìn)行輔助,善用 Instruments 可以節(jié)省我們大量的調(diào)試時(shí)間。

愿每一個(gè) iOS 開發(fā)者都可以掌握 iOS 的內(nèi)存管理技能。 

責(zé)任編輯:龐桂玉 來源: iOS開發(fā)by唐巧
相關(guān)推薦

2023-10-18 13:31:00

Linux內(nèi)存

2015-03-13 09:30:23

iOS內(nèi)存管理

2018-07-23 09:26:08

iOS內(nèi)存優(yōu)化

2017-03-07 10:15:35

iOS內(nèi)存管理開發(fā)

2011-07-21 09:32:07

Objective-C 內(nèi)存 Autoreleas

2016-04-11 09:30:49

內(nèi)存管理ios開發(fā)

2010-07-20 08:50:00

autoreleaseObjective C

2013-06-20 10:25:56

2011-07-21 14:42:45

iOS UIViewCont 內(nèi)存

2011-08-16 17:43:47

Objective-C內(nèi)存管理Autorelease

2015-06-25 09:47:20

iOS內(nèi)存管理

2025-09-28 01:00:00

2023-12-31 12:56:02

C++內(nèi)存編程

2014-03-12 09:37:22

內(nèi)存管理autoreleaseautorelease

2024-03-20 10:48:09

Java 8內(nèi)存管理

2024-08-28 17:45:00

內(nèi)存Linux

2019-12-26 08:45:46

Linux虛擬內(nèi)存

2011-07-21 17:40:43

iOS 多核 內(nèi)存

2011-08-05 16:41:48

iOS 隊(duì)列 內(nèi)存

2016-03-03 10:07:39

ios內(nèi)存管理面試總結(jié)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號

欧美亚洲另类小说| 国产精品自拍视频在线| 色婷婷av一区二区三区之红樱桃| 99精品国产99久久久久久福利| 亚洲电影av在线| 日日橹狠狠爱欧美超碰| 国产视频三区四区| 欧美日韩国产网站| 亚洲欧美国产三级| 国内精品视频免费| 性高潮视频在线观看| 欧美福利影院| 亚洲欧美在线免费观看| 五月激情婷婷在线| 激情视频网站在线播放色| 国产欧美一区二区精品性色 | 日本女人性生活视频| 亚洲电影一区| 欧美色精品在线视频| 久久天天东北熟女毛茸茸| 三区在线视频| 成人妖精视频yjsp地址| 国产精品第一页在线| 欧美黄色免费观看| 成人中文在线| 日韩电影中文字幕在线观看| 午夜诱惑痒痒网| 成人国产一区| 欧美日韩一区二区精品| www.18av.com| 里番在线观看网站| 国产视频一区在线播放| 精品欧美一区二区久久久伦| aaa一区二区| 美女脱光内衣内裤视频久久网站| 2019最新中文字幕| 久久无码精品丰满人妻| 91精品国产乱码久久久久久| 亚洲人高潮女人毛茸茸| 国产一级伦理片| 亚洲国产欧美国产第一区| 欧美日本一区二区三区四区| 成人性视频欧美一区二区三区| 狂野欧美激情性xxxx欧美| 综合亚洲深深色噜噜狠狠网站| 欧美资源一区| 亚洲人妻一区二区三区| 成人精品视频一区二区三区尤物| 91综合免费在线| 中文在线字幕av| 日韩成人免费电影| 国产成人精品久久二区二区| 丰满人妻老熟妇伦人精品| 亚洲精品在线二区| 久久久欧美一区二区| 久久成人在线观看| 国产一区清纯| 欧美极品欧美精品欧美视频| 久久国产在线观看| 欧美精品偷拍| 久久久亚洲精选| 日产精品久久久久久久| 在线亚洲观看| 国产精品wwww| 91久久精品国产91性色69| 久久草av在线| 99视频免费观看蜜桃视频| 亚洲av无码乱码国产精品久久| 国产麻豆精品在线| 国产精品国模大尺度私拍| 肥臀熟女一区二区三区| 成人手机在线视频| 老牛影视免费一区二区| 国产一二在线观看| 国产精品无圣光一区二区| 一级二级三级欧美| 在线中文字幕电影| 亚洲mv在线观看| 91免费视频网站在线观看| 电影久久久久久| 欧美性感一类影片在线播放| 婷婷中文字幕在线观看| 伊人精品综合| 亚洲欧美视频在线| 日韩免费av一区| 欧美久久影院| 热门国产精品亚洲第一区在线| 最新中文字幕在线观看视频| 久久国产精品露脸对白| 成人黄色在线免费观看| 美女欧美视频在线观看免费| 国产精品传媒入口麻豆| 免费拍拍拍网站| 精品3atv在线视频| 欧美一区在线视频| 中文字幕av观看| 日韩激情图片| 91黄色8090| 国产精品国产三级国产普通话对白| 国产成人午夜电影网| 欧美日韩系列| 中文字幕伦理免费在线视频| 欧美日韩午夜剧场| 欧美性受xxxxxx黑人xyx性爽| 久久资源综合| 久久精品最新地址| 黄色片网站在线免费观看| 久久99国产精品免费| 久久久综合香蕉尹人综合网| 国产日产一区二区三区| 色猫猫国产区一区二在线视频| 在线观看日本www| 欧美猛男男男激情videos| 欧美日韩aaaa| 一本色道久久综合亚洲| 97久久超碰国产精品| 日韩不卡一二区| 成人看片在线观看| 亚洲国产一区自拍| 朝桐光av在线| 日本美女视频一区二区| 国产日产精品一区二区三区四区| 日本美女高清在线观看免费| 亚洲国产aⅴ成人精品无吗| 亚洲xxx在线观看| 亚洲品质自拍| 韩国视频理论视频久久| 国产同性人妖ts口直男| 国产精品久久久久一区| 美女福利视频在线| 国产91精品入| 欧美国产日韩二区| 国产乱码一区二区| 国产精品美女视频| 特级丰满少妇一级| 美女毛片一区二区三区四区最新中文字幕亚洲| 久操成人在线视频| 国产视频一二三四区| 国产精品拍天天在线| 国产福利一区视频| 免费看av成人| 日本三级久久久| 青青草视频免费在线观看| 亚洲最大的成人av| 国产大学生av| 黄色av成人| 国产精品免费在线| 俺来也官网欧美久久精品| 日韩欧美第一区| 久久婷婷一区二区| 成人av一区二区三区| 99er在线视频| 女同另类激情重口| 91精品国产高清久久久久久久久 | 亚洲精品555| 亚洲网在线观看| 国产美女www爽爽爽| 欧美激情在线看| www.亚洲高清| 91精品啪在线观看国产18| 成人自拍性视频| 羞羞网站在线免费观看| 日韩女优av电影| 日产电影一区二区三区| 久久综合久久久久88| 国产v亚洲v天堂无码久久久| 欧美高清视频在线观看mv| 成人黄在线观看| 色呦呦在线播放| 亚洲国产三级网| 国产尤物在线视频| 国产日韩亚洲欧美综合| 在线黄色免费看| 亚洲私拍自拍| 欧美日韩一区二区三| 成人自拍视频网| 麻豆成人在线看| 日韩专区第一页| 91久久精品一区二区三| 麻豆精品国产免费| 成人精品一区二区三区四区| 成人小视频在线看| 午夜久久免费观看| 国产一区二区三区无遮挡 | 欧美视频精品一区| 欧美自拍偷拍网| 国产不卡视频在线观看| 日本a级片免费观看| 99精品视频在线观看免费播放 | 一区二区三区日本久久久| 国产精品观看在线亚洲人成网| 快射视频在线观看| 亚洲黄色在线看| 亚洲天堂视频网| 亚洲一区二区精品视频| www.av天天| 高清不卡一区二区| 另类小说第一页| 欧美全黄视频| 午夜精品短视频| 国产福利资源一区| 国产精品永久免费观看| 波多野结衣视频一区二区| 色777狠狠综合秋免鲁丝| 囯产精品久久久久久| 欧美三级日本三级少妇99| 国产午夜久久久| 国产精品亲子伦对白| 成人免费看aa片| 国产高清成人在线| 日本xxxx黄色| 亚洲综合99| 无码日本精品xxxxxxxxx| 久久国产精品亚洲人一区二区三区 | 国产99一区视频免费| 一区二区三区韩国| 亚洲美女少妇无套啪啪呻吟| 国产大尺度在线观看| 欧美人与牛zoz0性行为| 国产精品9999久久久久仙踪林| 久久精品97| 国产999视频| 多野结衣av一区| 欧美大胆a视频| 自拍视频在线网| 亚洲欧美中文日韩在线| 欧美性受xxxx狂喷水| 91精品国产综合久久精品性色| 波多野结衣不卡| 欧美性xxxx在线播放| 日韩精品成人一区| 亚洲午夜精品17c| www.99re7| 亚洲老司机在线| 伊人久久久久久久久久久久久久| 久久久电影一区二区三区| 日本护士做爰视频| 国产91富婆露脸刺激对白| 三级黄色片播放| 国产在线播放一区| 毛片毛片毛片毛| 久久成人久久鬼色| 成人黄色一级大片| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲国产精品毛片av不卡在线| 国产精品丝袜xxxxxxx| 国产亚洲综合视频| 亚洲自拍另类| 一本久道综合色婷婷五月| 亚洲欧美日韩在线观看a三区| 色欲色香天天天综合网www| 国内揄拍国内精品久久| av日韩在线看| 亚洲激情网站| 日韩av综合在线观看| 国产精品毛片在线看| 女性女同性aⅴ免费观女性恋| 一区二区精品| 97在线免费公开视频| 视频一区中文字幕国产| 成人性视频欧美一区二区三区| 美女久久久精品| 午夜天堂在线视频| 国产成人综合亚洲91猫咪| 好吊操视频这里只有精品| 成人精品鲁一区一区二区| 中文精品在线观看| 久久久久久久久久久久久久久99 | 羞羞答答成人影院www| 黄色小视频大全| 亚洲国内欧美| 欧美丰满熟妇xxxxx| 久久99久久精品| 性感美女一区二区三区| 成人国产精品免费网站| 日韩一区二区a片免费观看| 亚洲欧洲精品天堂一级| 久久一区二区三| 一本色道久久综合亚洲aⅴ蜜桃 | 中文字幕第四页| 欧美日韩亚州综合| 午夜老司机福利| 亚洲伦理中文字幕| 黄视频网站在线| 国内精品免费午夜毛片| 欧美日韩在线精品一区二区三区激情综合 | 亚洲精品美女免费| 成年人视频在线免费观看| 欧美精品免费在线观看| 新版的欧美在线视频| 91精品国产自产在线老师啪| 黄色美女久久久| 亚洲三区在线| 99精品视频免费| 污污视频网站在线| 91美女片黄在线观看| 一起操在线播放| 欧美午夜丰满在线18影院| 国产精品久久久久久久久毛片| 亚洲国产精品va在线看黑人动漫| 超碰免费97在线观看| 色综合久久悠悠| 韩日精品一区| 国产欧美日韩综合精品二区| 欧美黄色大片在线观看| 欧美a v在线播放| 国产乱对白刺激视频不卡| 亚洲熟妇一区二区三区| 一区二区三区四区在线播放| 欧美视频xxxx| 日韩福利在线播放| 天堂av最新在线| 国产精品美女无圣光视频| 巨人精品**| 国产在线拍揄自揄拍无码| 日日夜夜免费精品| 丰满岳乱妇一区二区| 综合激情成人伊人| 老熟妇一区二区三区| 亚洲精品在线三区| 影音先锋在线视频| 国产精品视频精品| 蜜臀91精品国产高清在线观看| www.夜夜爱| 国产精品亚洲人在线观看| 老司机精品免费视频| 色婷婷久久久亚洲一区二区三区| 免费的黄色av| 九九热这里只有在线精品视 | 久久国产精品一区二区三区四区| 欧美在线视屏| 国产精品igao网网址不卡| 国产精品久久久久国产精品日日 | 日韩三级中文字幕| 九七久久人人| 国产日韩av高清| 四虎国产精品免费观看| www.色就是色| 国产欧美一区二区精品性色| 四虎影院在线免费播放| 亚洲精品一区二三区不卡| 欧美男男tv网站在线播放| 国产欧美日韩一区| 亚洲高清网站| 四虎精品一区二区| 午夜伊人狠狠久久| 天天操天天射天天| 97色在线观看| 亚洲bt欧美bt精品777| 免费在线观看毛片网站| 久久久综合网站| 欧美日韩在线视频播放| 中文字幕av一区中文字幕天堂 | 亚洲一级理论片| 欧美日韩一区二区在线观看视频| www.成人.com| 成人国产精品久久久久久亚洲| 91精品一区二区三区综合| 五月天丁香花婷婷| 一区二区久久久久久| 丰满熟妇人妻中文字幕| 性色av一区二区三区免费| 日韩成人午夜| 免费看黄色一级大片| 国产精品初高中害羞小美女文| 国产精品久久无码一三区| 久久国产精品久久久久久| jizz18欧美18| 欧美一级片中文字幕| 国产精品无遮挡| 亚洲国产精品二区| 91国内免费在线视频| 日韩伦理一区| 久久精品无码一区二区三区毛片| 亚洲国产视频a| 久草在线青青草| 国产有码在线一区二区视频| 亚洲午夜伦理| 成年人免费观看视频网站| 欧美日韩1区2区| av资源网在线播放| 午夜欧美性电影| 国产99久久久国产精品潘金| 日本一级一片免费视频| 伊人精品在线观看| 日韩区欧美区| 超碰av在线免费观看| 亚洲激情图片qvod| 日本人妖在线| 亚洲a中文字幕| 久久国产66| 91精品国产高清一区二区三蜜臀| 日韩经典中文字幕在线观看| 日本精品久久| 成人网站免费观看入口| 国产精品久久久久影院色老大| 人妻一区二区三区| 国产日韩欧美自拍| 国产欧美日韩一级| 亚洲一级生活片|