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

Objective-C內(nèi)存管理教程和原理剖析

移動開發(fā) iOS
本文介紹的是Objective-C內(nèi)存管理教程和原理剖析,還詳細的對Autorelease進行了介紹,我們來看內(nèi)容。

Objective-C內(nèi)存管理教程和原理剖析是本文要介紹的內(nèi)容,在iPhoneMac 平臺運行,不多說,我們來看內(nèi)容。

初學(xué)objectice-C的朋友都有一個困惑,總覺得對objective-C內(nèi)存管理機制琢磨不透,程序經(jīng)常內(nèi)存泄漏或莫名其妙的崩潰。我在這里總結(jié)了自己對objective-C內(nèi)存管理機制的研究成果和經(jīng)驗,寫了這么一個由淺入深的教程。希望對大家有所幫助,也歡迎大家一起探討。

此文涉及的內(nèi)存管理是針對于繼承于NSObject的Class。

一 基本原理

Objective-C內(nèi)存管理機制與.Net/Java那種全自動的垃圾回收機制是不同的,它本質(zhì)上還是C語言中的手動管理方式,只不過稍微加了一些自動方法。

1、Objective-C的對象生成于堆之上,生成之后,需要一個指針來指向它。

  1. ClassA *obj1 = [[ClassA alloc] init]; 

2、Objective-C的對象在使用完成之后不會自動銷毀,需要執(zhí)行dealloc來釋放空間(銷毀),否則內(nèi)存泄露。

  1. [obj1 dealloc];  

這帶來了一個問題。下面代碼中obj2是否需要調(diào)用dealloc?

  1. ClassA *obj1 = [[ClassA alloc] init];  
  2. ClassA *obj2 = obj1;  
  3. [obj1 hello]; //輸出hello  
  4. [obj1 dealloc];  
  5. [obj2 hello]; //能夠執(zhí)行這一行和下一行嗎?  
  6. [obj2 dealloc];  

不能,因為obj1和obj2只是指針,它們指向同一個對象,[obj1 dealloc]已經(jīng)銷毀這個對象了,不能再調(diào)用[obj2 hello]和[obj2 dealloc]。obj2實際上是個無效指針。

如何避免無效指針?請看下一條。

3、Objective-C采用了引用計數(shù)(ref count或者retain count)。對象的內(nèi)部保存一個數(shù)字,表示被引用的次數(shù)。例如,某個對象被兩個指針?biāo)赶颍ㄒ茫┠敲此膔etain count為2。需要銷毀對象的時候,不直接調(diào)用dealloc,而是調(diào)用release。release會讓retain count減1,只有retain count等于0,系統(tǒng)才會調(diào)用dealloc真正銷毀這個對象。

  1. ClassA *obj1 = [[ClassA alloc] init]; //對象生成時,retain count = 1 
  2. [obj1 release]; //release使retain count減1,retain count = 0,dealloc自動被調(diào)用,對象被銷毀 

我們回頭看看剛剛那個無效指針的問題,把dealloc改成release解決了嗎?

  1. ClassA *obj1 = [[ClassA alloc] init]; //retain count = 1 
  2. ClassA *obj2 = obj1; //retain count = 1 
  3. [obj1 hello]; //輸出hello  
  4. [obj1 release]; //retain count = 0,對象被銷毀  
  5. [obj2 hello];  
  6. [obj2 release];   
  7. [obj1 release]之后,obj2依然是個無效指針。問題依然沒有解決。解決方法見下一條。 

4、Objective-C指針賦值時,retain count不會自動增加,需要手動retain。

  1. ClassA *obj1 = [[ClassA alloc] init]; //retain count = 1 
  2. ClassA *obj2 = obj1; //retain count = 1 
  3. [obj2 retain]; //retain count = 2 
  4. [obj1 hello]; //輸出hello  
  5. [obj1 release]; //retain count = 2 – 11 = 1  
  6. [obj2 hello]; //輸出hello  
  7. [obj2 release]; //retain count = 0,對象被銷毀 

問題解決!注意,如果沒有調(diào)用[obj2 release],這個對象的retain count始終為1,不會被銷毀,內(nèi)存泄露。(1-4可以參考附件中的示例程序memman-no-pool.m)

這樣的確不會內(nèi)存泄露,但似乎有點麻煩,有沒有簡單點的方法?見下一條。

5、Objective-C中引入了autorelease pool(自動釋放對象池),在遵守一些規(guī)則的情況下,可以自動釋放對象。(autorelease pool依然不是.Net/Java那種全自動的垃圾回收機制)

(1)新生成的對象,只要調(diào)用autorelease就行了,無需再調(diào)用release!

  1. ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1 但無需調(diào)用release 

(2)對于存在指針賦值的情況,代碼與前面類似。

  1. ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1 
  2. ClassA *obj2 = obj1; //retain count = 1 
  3. [obj2 retain]; //retain count = 2 
  4. [obj1 hello]; //輸出hello  
  5. //對于obj1,無需調(diào)用(實際上不能調(diào)用)release  
  6. [obj2 hello]; //輸出hello  
  7. [obj2 release]; //retain count = 2-1 = 1 

細心的讀者肯定能發(fā)現(xiàn)這個對象沒有被銷毀,何時銷毀呢?誰去銷毀它?(可以參考附件中的示例程序memman-with-pool.m)請看下一條。

6、autorelease pool原理剖析。(其實很簡單的,一定要堅持看下去,否則還是不能理解Objective-C的內(nèi)存管理機制。)

(1)autorelease pool不是天生的,需要手動創(chuàng)立。只不過在新建一個iphone項目時,xcode會自動幫你寫好。autorelease pool的真名是NSAutoreleasePool。

  1. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

(2)NSAutoreleasePool內(nèi)部包含一個數(shù)組(NSMutableArray),用來保存聲明為autorelease的所有對象。如果一個對象聲明為autorelease,系統(tǒng)所做的工作就是把這個對象加入到這個數(shù)組中去。

ClassA *obj1 = [[[ClassA alloc] init] autorelease]; //retain count = 1,把此對象加入autorelease pool中

(3)NSAutoreleasePool自身在銷毀的時候,會遍歷一遍這個數(shù)組,release數(shù)組中的每個成員。如果此時數(shù)組中成員的retain count為1,那么release之后,retain count為0,對象正式被銷毀。如果此時數(shù)組中成員的retain count大于1,那么release之后,retain count大于0,此對象依然沒有被銷毀,內(nèi)存泄露。

(4)默認(rèn)只有一個autorelease pool,通常類似于下面這個例子。

  1. int main (int argc, const char *argv[])  
  2. {  
  3. NSAutoreleasePool *pool;  
  4. pool = [[NSAutoreleasePool alloc] init];  
  5. // do something  
  6. [pool release];  
  7. return (0);  
  8. } // main 

所有標(biāo)記為autorelease的對象都只有在這個pool銷毀時才被銷毀。如果你有大量的對象標(biāo)記為autorelease,這顯然不能很好的利用內(nèi)存,在iphone這種內(nèi)存受限的程序中是很容易造成內(nèi)存不足的。例如:

  1. int main (int argc, const char *argv[])  
  2. {  
  3. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  4. int i, j;  
  5. for (i = 0; i < 100; i++ )  
  6. {  
  7.  for (j = 0; j < 100000; j++ )  
  8.     [NSString stringWithFormat:@"1234567890"];//產(chǎn)生的對象是autorelease的。  
  9. }  
  10. [pool release];  
  11. return (0);  
  12. } // main 

(可以參考附件中的示例程序memman-many-objs-one-pool.m,運行時通過監(jiān)控工具可以發(fā)現(xiàn)使用的內(nèi)存在急劇增加,直到pool銷毀時才被釋放)你需要考慮下一條。
 
7、Objective-C程序中可以嵌套創(chuàng)建多個autorelease pool。在需要大量創(chuàng)建局部變量的時候,可以創(chuàng)建內(nèi)嵌的autorelease pool來及時釋放內(nèi)存。(感謝網(wǎng)友hhyytt和neogui的提醒,某些情況下,系統(tǒng)會自動創(chuàng)建autorelease pool, 請參見第四章)

  1. int main (int argc, const char *argv[])  
  2. {  
  3. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];  
  4. int i, j;  
  5. for (i = 0; i < 100; i++ )  
  6. {  
  7.  NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];  
  8.  for (j = 0; j < 100000; j++ )  
  9.     [NSString stringWithFormat:@"1234567890"];//產(chǎn)生的對象是autorelease的。  
  10.  [loopPool release];  
  11. }  
  12. [pool release];  
  13. return (0);  
  14. } // main 

(可以參考附件中的示例程序memman-many-objs-many-pools.m,占用內(nèi)存的變化極小)

#p#

二 口訣與范式

1、口訣。

(1)誰創(chuàng)建,誰釋放(類似于“誰污染,誰治理”)。如果你通過alloc、new或copy來創(chuàng)建一個對象,那么你必須調(diào)用release或autorelease。換句話說,不是你創(chuàng)建的,就不用你去釋放。
例如,你在一個函數(shù)中alloc生成了一個對象,且這個對象只在這個函數(shù)中被使用,那么你必須在這個函數(shù)中調(diào)用release或autorelease。如果你在一個class的某個方法中alloc一個成員對象,且沒有調(diào)用autorelease,那么你需要在這個類的dealloc方法中調(diào)用release;如果調(diào)用了autorelease,那么在dealloc方法中什么都不需要做。

(2)除了alloc、new或copy之外的方法創(chuàng)建的對象都被聲明了autorelease

(3)誰retain,誰release。只要你調(diào)用了retain,無論這個對象是如何生成的,你都要調(diào)用release。有時候你的代碼中明明沒有retain,可是系統(tǒng)會在默認(rèn)實現(xiàn)中加入retain。不知道為什么蘋果公司的文檔沒有強調(diào)這個非常重要的一點,請參考范式2.7和第三章。

2、范式。

范式就是模板,就是依葫蘆畫瓢。由于不同人有不同的理解和習(xí)慣,我總結(jié)的范式不一定適合所有人,但我能保證照著這樣做不會出問題。

(1)創(chuàng)建一個對象。

  1. ClassA *obj1 = [[ClassA alloc] init]; 

(2)創(chuàng)建一個autorelease的對象。

  1. ClassA *obj1 = [[[ClassA alloc] init] autorelease]; 

(3)Release一個對象后,立即把指針清空。(順便說一句,release一個空指針是合法的,但不會發(fā)生任何事情)

  1. [obj1 release];  
  2. obj1 = nil

(4)指針賦值給另一個指針。

  1. ClassA *obj2 = obj1;  
  2. [obj2 retain];  
  3. //do something  
  4. [obj2 release];  
  5. obj2 = nil

(5)在一個函數(shù)中創(chuàng)建并返回對象,需要把這個對象設(shè)置為autorelease

  1. ClassA *Func1()  
  2. {  
  3.   ClassA *obj = [[[ClassA alloc]init]autorelease];  
  4.   return obj;  

(6)在子類的dealloc方法中調(diào)用基類的dealloc方法

  1. -(void) dealloc  
  2. {         [super dealloc];  

(7)在一個class中創(chuàng)建和使用property。

聲明一個成員變量。

  1. ClassB *objB; 

聲明property,加上retain參數(shù)。

  1. @property (retain) ClassB* objB; 

定義property。(property的默認(rèn)實現(xiàn)請看第三章)

  1. @synthesize objB; 

除了dealloc方法以外,始終用.操作符的方式來調(diào)用property。

self.objB 或者objA.objB

在dealloc方法中release這個成員變量。

  1. [objB release]; 

示例代碼如下(詳細代碼請參考附件中的memman-property.m,你需要特別留意對象是在何時被銷毀的。):

  1. @interface ClassA : NSObject  
  2. {  
  3.          ClassB* objB;  
  4. }  
  5.  
  6. @property (retain) ClassB* objB;  
  7. @end  
  8. @implementation ClassA  
  9. @synthesize objB;  
  10. -(void) dealloc  
  11. {  
  12.          [objB release];  
  13.          [super dealloc];  
  14. }  
  15. @end 

給這個property賦值時,有手動release和autorelease兩種方式。

  1. void funcNoAutorelease()  
  2. {  
  3.          ClassB *objB1 = [[ClassB alloc]init];  
  4.          ClassA *objA = [[ClassA alloc]init];  
  5.          objA.objB = objB1;  
  6.          [objB1 release];  
  7.          [objA release];  
  8. }  
  9.  
  10. void funcAutorelease()  
  11. {  
  12.          ClassB *objB1 = [[[ClassB alloc]init] autorelease];  
  13.          ClassA *objA = [[[ClassA alloc]init] autorelease];  
  14.          objA.objB = objB1;  

#p#

三 @property (retain)和@synthesize的默認(rèn)實現(xiàn)

在這里解釋一下@property (retain) ClassB* objB;和@synthesize objB;背后到底發(fā)生了什么(retain property的默認(rèn)實現(xiàn))。property實際上是getter和setter,針對有retain參數(shù)的property,背后的實現(xiàn)如下(請參考附件中的memman-getter-setter.m,你會發(fā)現(xiàn),結(jié)果和memman-property.m一樣):

  1. @interface ClassA : NSObject  
  2. {  
  3.          ClassB *objB;  
  4. }  
  5. -(ClassB *) getObjB;  
  6.  
  7. -(void) setObjB:(ClassB *) value;  
  8. @end  
  9. @implementation ClassA  
  10.  
  11. -(ClassB*) getObjB  
  12. {  
  13.          return objB;  
  14. }  
  15.  
  16. -(void) setObjB:(ClassB*) value  
  17. {  
  18.          if (objB != value)  
  19.          {  
  20.                    [objB release];  
  21.                    objB = [value retain];  
  22.          }  

在setObjB中,如果新設(shè)定的值和原值不同的話,必須要把原值對象release一次,這樣才能保證retain count是正確的。

由于我們在class內(nèi)部retain了一次(雖然是默認(rèn)實現(xiàn)的),所以我們要在dealloc方法中release這個成員變量。

  1. -(void) dealloc  
  2. {  
  3.          [objB release];  
  4.          [super dealloc];  

四 系統(tǒng)自動創(chuàng)建新的autorelease pool

在生成新的Run Loop的時候,系統(tǒng)會自動創(chuàng)建新的autorelease pool(非常感謝網(wǎng)友hhyytt和neogui的提醒)。注意,此處不同于xcode在新建項目時自動生成的代碼中加入的autorelease pool,xcode生成的代碼可以被刪除,但系統(tǒng)自動創(chuàng)建的新的autorelease pool是無法刪除的(對于無Garbage Collection的環(huán)境來說)。Objective-C沒有給出實現(xiàn)代碼,官方文檔也沒有說明,但我們可以通過小程序來證明。

在這個小程序中,我們先生成了一個autorelease pool,然后生成一個autorelease的ClassA的實例,再在一個新的run loop中生成一個autorelease的ClassB的對象(注意,我們并沒有手動在新run loop中生成autorelease pool)。精簡的示例代碼如下,詳細代碼請見附件中的memman-run-loop-with-pool.m。

  1. int main(int argc, char**argv)    
  2. {  
  3.          NSLog(@"create an autorelasePool\n");  
  4.          NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];      
  5.          NSLog(@"create an instance of ClassA and autorelease\n");  
  6.          ClassA *obj1 = [[[ClassA alloc] init] autorelease];  
  7.          NSDate *now = [[NSDate alloc] init];  
  8.          NSTimer *timer = [[NSTimer alloc] initWithFireDate:now  
  9.                    interval:0.0  
  10.                    target:obj1  
  11.                    selector:@selector(createClassB)  
  12.                    userInfo:nil  
  13.                    repeats:NO];   
  14.          NSRunLoop *runLoop = [NSRunLoop currentRunLoop];  
  15.          [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];  
  16.          [timer release];  
  17.          [now release];  
  18.          [runLoop run]; //在新loop中調(diào)用一函數(shù),生成ClassB的autorelease實例  
  19.          NSLog(@"releasing autorelasePool\n");   
  20.          [pool release];   
  21.          NSLog(@"autorelasePool is released\n");   
  22.          return 0;  
  23. }   

輸出如下:

  1. create an autorelasePool  
  2. create an instance of ClassA and autorelease  
  3. create an instance of ClassB and autorelease  
  4. ClassB destroyed  
  5. releasing autorelasePool  
  6. ClassA destroyed  
  7. autorelasePool is released 

注意在我們銷毀autorelease pool之前,ClassB的autorelease實例就已經(jīng)被銷毀了。

有人可能會說,這并不能說明新的run loop自動生成了一個新的autorelease pool,說不定還只是用了老的autorelease pool,只不過后來drain了一次而已。我們可以在main函數(shù)中不生成autorelease pool。精簡的示例代碼如下,詳細代碼請見附件中的memman-run-loop-without-pool.m。

  1. int main(int argc, char**argv)    
  2. {  
  3.          NSLog(@"No autorelasePool created\n");  
  4.          NSLog(@"create an instance of ClassA\n");  
  5.          ClassA *obj1 = [[ClassA alloc] init];  
  6.          NSDate *now = [[NSDate alloc] init];  
  7.          NSTimer *timer = [[NSTimer alloc] initWithFireDate:now  
  8.                    interval:0.0  
  9.                    target:obj1  
  10.                    selector:@selector(createClassB)  
  11.                    userInfo:nil  
  12.                    repeats:NO];   
  13.          NSRunLoop *runLoop = [NSRunLoop currentRunLoop];  
  14.          [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];  
  15.          [timer release];  
  16.          [now release];  
  17.          [runLoop run]; //在新loop中調(diào)用一函數(shù),生成ClassB的autorelease實例  
  18.          NSLog(@"Manually release the instance of ClassA\n");  
  19.          [obj1 release];  
  20.          return 0;  
  21. }   

輸出如下:

  1. No autorelasePool created  
  2. create an instance of ClassA  
  3. create an instance of ClassB and autorelease  
  4. ClassB destroyed  
  5. Manually release the instance of ClassA  
  6. ClassA destroyed 

我們可以看出來,我們并沒有創(chuàng)建任何autorelease pool,可是ClassB的實例依然被自動銷毀了,這說明新的run loop自動創(chuàng)建了一個autorelease pool,這個pool在新的run loop結(jié)束的時候會銷毀自己(并自動release所包含的對象)。

補充說明

在研究retain count的時候,我不建議用NSString。因為在下面的語句中,

  1. NSString *str1 = @”constant string”; 

str1的retain count是個很大的數(shù)字。Objective-C對常量字符串做了特殊處理。

當(dāng)然,如果你這樣創(chuàng)建NSString,得到的retain count依然為1

  1. NSString *str2 = [NSString stringWithFormat:@”123”]; 

涉及的示例程序代碼(已去除隱藏,覺得有用的話請頂一下此文):http://files.cnblogs.com/VinceYuan/objective-c-memman.zip

小結(jié):Objective-C內(nèi)存管理教程和原理剖析的內(nèi)容介紹完了,希望本文對你有所幫助

轉(zhuǎn)載時必須包含原始鏈接http://vinceyuan.cnblogs.com/,且必須包含此版權(quán)聲明的完整內(nèi)容。

責(zé)任編輯:zhaolei 來源: CSDN博客
相關(guān)推薦

2011-07-19 15:15:09

Objective-C 內(nèi)存

2013-04-11 14:37:36

Objective-CiOS內(nèi)存管理系統(tǒng)自動創(chuàng)建新的aut

2013-04-11 14:32:00

Objective-CiOS開發(fā)內(nèi)存管理@synthesize

2013-04-11 13:57:27

Objective-CiOS開發(fā)內(nèi)存管理

2013-04-11 14:16:57

Objective-CiOS開發(fā)內(nèi)存管理

2011-07-18 17:14:16

Objective-C 內(nèi)存 Cocoa

2011-07-29 16:08:31

Objective-C 內(nèi)存

2011-07-27 17:10:30

Objective-C 持久化

2011-05-11 15:45:50

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

2011-07-20 17:04:43

Objective-C 內(nèi)存 內(nèi)存泄露

2011-07-21 09:32:07

Objective-C 內(nèi)存 Autoreleas

2011-07-21 10:10:42

Objective-C 內(nèi)存 Autoreleas

2011-08-16 17:43:47

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

2011-08-01 11:37:41

iPhone Objective- 內(nèi)存

2011-08-18 13:28:35

Objective-C內(nèi)存

2011-07-08 13:49:46

Objective-C UUID

2011-08-05 14:03:39

Objective-C 對象 模板

2011-08-22 09:48:16

WindowsObjective-C

2011-08-16 10:23:04

Objective-CNSAutoreleaXcode常用鍵

2013-05-02 10:51:17

iOS開發(fā)Objective-C@property
點贊
收藏

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

欧美视频在线播放一区| 久久久久久久久久久久久9999| 成人一级黄色大片| av不卡一区二区| 色婷婷综合五月| 国产人妻互换一区二区| 性xxxxbbbb| 国产一区二区三区av电影| 97在线视频观看| 精品国产三级| 麻豆91精品视频| 久久久日本电影| youjizz亚洲女人| 999国产精品一区| 91福利视频网站| 成人免费看片'免费看| 国模精品一区二区| 国产美女精品在线| 日本在线观看天堂男亚洲 | 亚洲色成人www永久网站| 成人在线免费观看网站| 亚洲第一精品福利| a级大片免费看| 日韩高清在线| 精品人伦一区二区三区蜜桃免费| 国产又爽又黄ai换脸| 欧美精品a∨在线观看不卡| 国产精品一区在线观看乱码| 国产精品黄色av| 日本少妇激情舌吻| 午夜精品电影| 综合av色偷偷网| 香蕉网在线播放| 免费日韩一区二区三区| 欧美一级xxx| 999这里有精品| 91成人抖音| 色网综合在线观看| 日韩欧美精品在线观看视频| 91福利在线尤物| 亚洲黄一区二区三区| 中文字幕中文字幕在线中心一区| 国产在线资源| 久久亚洲精品国产精品紫薇| 国产综合动作在线观看| 丰满人妻一区二区三区无码av| 精品在线观看视频| 国产精品一二三在线| 成人免费一级片| 麻豆精品网站| 浅井舞香一区二区| 久久久黄色大片| 亚洲一区日韩在线| 69国产精品成人在线播放| 日本熟女一区二区| 亚洲大胆视频| 午夜精品一区二区三区在线视频 | 国产情侣久久久久aⅴ免费| 国产成年精品| 日韩午夜av一区| 午夜影院免费版| 99亚洲乱人伦aⅴ精品| 精品久久一区二区三区| 日韩少妇一区二区| 久久丝袜视频| 国产亚洲a∨片在线观看| 91视频在线网站| 欧美在线电影| 久久久97精品| 久青草免费视频| 国产精品亚洲欧美| 日韩av手机在线看| 亚洲系列在线观看| 国产美女精品一区二区三区| 国产精品国产亚洲精品看不卡15 | 综合国产在线视频| 中文字幕无码日韩专区免费| 午夜久久一区| 91高潮精品免费porn| 中文字幕免费高清网站| 久久国产成人午夜av影院| 91在线免费观看网站| 色噜噜在线播放| 久久先锋影音av鲁色资源 | 亚洲小说欧美另类社区| 91大神福利视频在线| 中文av免费观看| 国产精品影视在线观看| 久久99国产精品| 1区2区3区在线观看| 一区二区三区日本| 久久精品国产精品亚洲色婷婷| 国产精品久久久久av电视剧| 欧美精品视频www在线观看| wwwxxxx在线观看| 国产不卡一二三区| 久久亚洲综合国产精品99麻豆精品福利| 玖玖爱免费视频| 日精品一区二区三区| 97超级碰碰| 国产天堂在线| 一区二区三区 在线观看视频| 日韩中文字幕三区| 久久久久久亚洲精品美女| 亚洲精品中文字| 午夜激情福利网| 免费精品视频| 91久久久一线二线三线品牌| 欧美日韩免费做爰大片| 一区二区三区四区不卡视频| 午夜欧美福利视频| 国产成人精品亚洲线观看| 中文国产成人精品久久一| 中文字幕一区二区三区手机版 | 激情综合闲人网| 亚洲一区二区五区| 性chinese极品按摩| 欧洲亚洲视频| 久久91精品国产91久久久| www.久久网| 99精品在线免费| 小泽玛利亚av在线| 久久久久久久性潮| 国产午夜精品久久久| 久久久久久久久久综合| 九色|91porny| 日本中文不卡| 亚洲同志男男gay1069网站| 欧美v日韩v国产v| 麻豆一区在线观看| 日韩成人免费电影| 欧美日韩一区二区三| 92久久精品| 欧美成人精品二区三区99精品| 黄色裸体一级片| 日日摸夜夜添夜夜添精品视频 | 经典三级在线| 日韩欧美中文字幕在线播放| 亚洲男人在线天堂| 亚洲国产99| 国产aⅴ精品一区二区三区黄| 精品孕妇一区二区三区| 欧美精品三级日韩久久| 欧美性生交大片| 奇米在线7777在线精品| 日韩欧美在线一区二区| 亚洲国产尤物| 国产一区二区三区精品久久久 | 男男成人高潮片免费网站| 九九九九九九精品| 性欧美xxx69hd高清| 日韩成人免费视频| 成年人视频在线免费看| 91丨porny丨在线| 免费av网址在线| 国产91精品对白在线播放| 欧美一级在线亚洲天堂| 免费在线观看污视频| 日本韩国一区二区| 激情五月深爱五月| 久久99久久99小草精品免视看| 亚洲一区二区精品在线| 久久久久亚洲精品中文字幕| 久久91亚洲人成电影网站| 亚洲经典一区二区三区| 性欧美疯狂xxxxbbbb| 国产真实乱人偷精品| 羞羞视频在线观看欧美| 深田咏美在线x99av| 天天综合91| 欧美黑人巨大精品一区二区| 人妻无码中文字幕| 91国产免费观看| 天海翼在线视频| 丁香啪啪综合成人亚洲小说| 男人日女人逼逼| 国内精品久久久久久久影视简单| 国产精品一二三视频| 91精品久久久| 日韩成人激情在线| 一二三四区视频| 亚洲专区一二三| aaaaa一级片| 久久99国产精品尤物| 国产精品国三级国产av| 国产91精品对白在线播放| 91在线观看免费高清| 国产黄大片在线观看| 在线日韩中文字幕| www.好吊色| 在线视频一区二区三区| 91在线播放观看| 久久在线观看免费| 999久久久精品视频| 日韩一级网站| 中文网丁香综合网| 欧美黑白配在线| 91牛牛免费视频| 成人av免费电影网站| 欧美成人精品h版在线观看| 日产精品久久久久久久性色| 69av一区二区三区| 久久人妻免费视频| 一区二区久久久| 色欲狠狠躁天天躁无码中文字幕| 粉嫩aⅴ一区二区三区四区五区| 国产a级片免费观看| 激情久久一区| 中文字幕久久综合| 精品一区亚洲| 成人精品水蜜桃| 色999韩欧美国产综合俺来也| 98视频在线噜噜噜国产| 动漫一区在线| 在线看欧美日韩| 亚洲欧洲精品视频| 欧美成人精品3d动漫h| 亚洲中文字幕在线观看| 欧美日韩在线观看视频| 久久久久久久久艹| 一区在线中文字幕| a级片在线观看| 91亚洲资源网| 影音先锋资源av| 国产黄色成人av| 精品亚洲视频在线| 蜜臀av一区二区在线免费观看| 又粗又黑又大的吊av| 欧美特黄a级高清免费大片a级| 亚洲三区在线| 欧美色蜜桃97| 日本一区视频在线观看免费| 日韩影视高清在线观看| 国产精品免费一区二区三区在线观看 | 人妻少妇精品无码专区| 日韩欧美国产三级电影视频| 一区二区三区亚洲视频| 欧美午夜精品一区二区蜜桃| 波多野结衣啪啪| 色88888久久久久久影院按摩 | 国产精品久久久亚洲一区| 日韩一级性生活片| 亚洲国产导航| 欧美 日韩 国产在线观看| 亚洲第一精品影视| 成人黄色av片| 一本不卡影院| 国产成人精品视频免费看| 亚洲欧美不卡| 男人的天堂99| 久久亚洲一区| 成人性生生活性生交12| 奇米影视一区二区三区| www.亚洲高清| 国产综合久久久久影院| www激情五月| 高清av一区二区| 日本道中文字幕| 91在线一区二区| 国产精品无码一区二区三区| 国产亚洲一区字幕| 亚洲黄色网址大全| 亚洲色图视频网| 激情五月婷婷在线| 午夜精品久久一牛影视| 日韩精品在线观看免费| 在线视频亚洲一区| 国产精品色综合| 精品国产成人系列| 欧美挠脚心网站| 日韩中文字幕av| 美女av在线播放| 欧美激情一二区| 亚洲美女尤物影院| 国产精品久久久久久久久影视 | 国产精品一区二区三区不卡 | 97超碰免费观看| 欧美日韩免费观看一区=区三区| 精品人妻少妇一区二区| 毛片一区二区| 在线视频日韩欧美| 99精品黄色片免费大全| 四季av中文字幕| 一个色综合av| 老熟妇一区二区三区| 欧美一区二区三区在| 污污的视频网站在线观看| 一区二区三区视频在线| 性欧美video高清bbw| 日韩av免费一区| 日韩视频一区二区三区四区| 欧美激情国产日韩| 中国精品18videos性欧美| 看av免费毛片手机播放| 狠狠v欧美v日韩v亚洲ⅴ| 亚洲第九十七页| 中文字幕亚洲电影| 黄色大片网站在线观看| 欧美精品久久久久久久多人混战| 亚洲 国产 欧美 日韩| 久久久99久久精品女同性| 欧美极品影院| caoporen国产精品| 日韩精品一区二区久久| www.99热这里只有精品| 国产一区二区三区免费观看| 无码人妻精品一区二区中文| 亚洲中国最大av网站| 91在线观看喷潮| 亚洲人在线观看| 9999精品成人免费毛片在线看| 成人福利在线观看| av永久不卡| 日本免费不卡一区二区| 国产盗摄一区二区三区| 三级黄色片在线观看| 日韩欧美精品网站| 色婷婷视频在线| 欧美另类xxx| 亚洲欧洲二区| 日本在线播放不卡| 久久免费黄色| 成人免费av片| 天天综合天天做天天综合| 亚洲第一精品网站| 久久亚洲私人国产精品va| 全球中文成人在线| 日韩国产精品一区二区| 欧美亚洲一区| 亚洲一区二区三区无码久久| 亚洲一卡二卡三卡四卡| av一级黄色片| 美女福利精品视频| 4438五月综合| 最新欧美日韩亚洲| 久久精品国产一区二区三区免费看| 一级黄色性视频| 91国偷自产一区二区三区观看| 天天操天天干天天舔| 性色av一区二区三区在线观看| 奇米一区二区| 永久免费网站视频在线观看| 国内精品久久久久影院一蜜桃| 久草手机视频在线观看| 欧美日韩国产首页在线观看| 午夜视频在线观看网站| 国产欧美精品va在线观看| 欧美熟乱15p| 91小视频在线播放| 亚洲免费资源在线播放| 亚洲爱情岛论坛永久| 九九久久综合网站| 成人爽a毛片免费啪啪红桃视频| 真实国产乱子伦对白视频| 成人免费视频caoporn| 日韩精品一区二区三| 亚洲免费电影一区| 欧美日韩国产网站| 在线一区高清| 国产成人av电影| 亚洲免费激情视频| 亚洲欧美日韩区| 免费成人黄色网| 特级黄色录像片| 粉嫩13p一区二区三区| 国产成人亚洲欧洲在线| 亚洲男人第一av网站| 日本肉肉一区| 男人的天堂视频在线| bt7086福利一区国产| 蜜臀精品一区二区三区| 少妇久久久久久| 一区二区三区免费在线看| 黄色片网址在线观看| 亚洲国产精品高清| 99在线精品视频免费观看20| 97热精品视频官网| 国产精品片aa在线观看| 欧洲在线免费视频| 亚洲r级在线视频| 国产福利第一视频在线播放| 91精品国产综合久久香蕉的用户体验 | 精品久久国产一区| 日韩精品 欧美| 国产精品伦理一区二区| 亚洲国产精品久久人人爱潘金莲| 日本精品中文字幕| 亚洲九九在线| 亚洲调教欧美在线| 91麻豆精品国产91久久久久久久久 | 午夜精品久久久99热福利| 国产一区二区亚洲| xxxx视频在线观看| 91国内精品野花午夜精品| 美女91在线| 亚洲综合网中心| wwwwww.欧美系列| 国产视频一区二区三区四区五区| 51久久精品夜色国产麻豆| 一区二区三区午夜视频|