精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

亚洲国产sm捆绑调教视频| 免费视频一区二区| 精品偷拍各种wc美女嘘嘘| 国产精品无码av无码| 日本视频在线播放| 成人高清视频免费观看| 国产精品极品美女在线观看免费| 欧美国产亚洲一区| av电影在线观看网址| 懂色av噜噜一区二区三区av| 热99久久精品| 欧美精品成人久久| 欧美综合一区| 亚洲国产中文字幕在线观看| 99国产精品久久久久久| 日本天码aⅴ片在线电影网站| 天堂在线一区二区| 欧美成人免费一级人片100| 久久午夜夜伦鲁鲁片| 亚洲伊人伊成久久人综合网| 欧美日韩国产一区在线| 黄色影视在线观看| 久热av在线| av一区二区三区黑人| 成人免费福利在线| 国产精华7777777| 亚洲三级国产| 欧美第一黄色网| 国产真人真事毛片视频| 蜜臀av免费一区二区三区| 欧美一级久久久久久久大片| 777视频在线| 伊人久久视频| 激情av一区二区| 日韩专区第三页| 日本a级在线| 日本一二三四高清不卡| 久久久久无码国产精品一区| 亚洲毛片欧洲毛片国产一品色| 欧美全黄视频| 日韩一区av在线| 好吊视频在线观看| 夜夜春成人影院| 伦xxxx在线| 经典一区二区三区| 国产精品老女人视频| av资源免费观看| 激情91久久| 欧美激情xxxxx| 全网免费在线播放视频入口| 午夜av一区| 久久久国产精品免费| 欧美自拍偷拍网| 色一区二区三区四区| 中文字幕一区日韩电影| 五月天婷婷丁香网| 欧美激情偷拍自拍| 日韩在线观看免费av| 看全色黄大色黄女片18| 荡女精品导航| 亚洲福利视频免费观看| 亚洲精品成人无码毛片| 欧美视频三区| 欧美成人免费网站| 稀缺小u女呦精品呦| 99精品中文字幕在线不卡| 日韩美女一区二区三区| 91精品人妻一区二区三区蜜桃2| 男女羞羞视频在线观看| 亚洲伦在线观看| 亚洲第一页在线视频| 精精国产xxxx视频在线| 亚洲精品国产成人久久av盗摄| 好吊色欧美一区二区三区| 蜜臀久久99精品久久久| 国产91精品一区二区| 国产在线视频欧美一区二区三区| ,一级淫片a看免费| 韩国三级在线一区| www.成人av.com| 免费看av毛片| 久久一夜天堂av一区二区三区| 成人激情综合网| 国产精品一区二区三区在线免费观看 | 精品美女久久久久| 精品福利电影| 日本国产一区二区三区| 中文字字幕在线中文乱码| 国内精品久久久久影院一蜜桃| 欧美一级淫片videoshd| 国产精品21p| 久久精品国产亚洲一区二区三区 | 加勒比在线一区二区三区观看| 黄瓜视频在线免费观看| 男人操女人的视频在线观看欧美| 国模极品一区二区三区| 日本在线免费观看| 日韩和的一区二区| 7777精品伊久久久大香线蕉语言| 免费又黄又爽又猛大片午夜| 免费观看在线色综合| 3d精品h动漫啪啪一区二区| 免费看国产片在线观看| 久久精品在这里| 在线观看免费91| 春色校园综合激情亚洲| 在线精品亚洲一区二区不卡| 国产老头和老头xxxx×| 美女久久久久| 一区二区三区视频在线观看| 麻豆乱码国产一区二区三区 | eeuss中文| 污视频在线免费观看网站| 黄色成人av网| 午夜剧场高清版免费观看 | 国产精品入口尤物| 亚洲国产精品视频在线| 国产亚洲1区2区3区| 欧美 国产 精品| 欧美粗大gay| 欧美变态tickling挠脚心| www.黄色在线| 亚洲国产日韩在线| 成人国产亚洲精品a区天堂华泰| 懂色av中文字幕| 成人深夜在线观看| 色香蕉在线观看| 怡红院成人在线| 精品久久一区二区| av最新在线观看| 久久久人人人| 亚洲最大成人在线| 亚洲麻豆精品| 一本色道久久加勒比精品| 色综合久久久无码中文字幕波多| 国产在线一区不卡| 亚洲色图综合久久| www.国产高清| 成人国产电影网| 水蜜桃在线免费观看| 成人福利片在线| 亚洲石原莉奈一区二区在线观看| 国产老熟女伦老熟妇露脸| 在线免费观看日本欧美爱情大片| 欧美猛交免费看| 国产女优在线播放| 久久久久九九视频| 免费在线观看亚洲视频| 成人午夜三级| 久久久综合av| 性猛交富婆╳xxx乱大交天津 | 亚洲国产精品麻豆| 精品国产乱码久久久久久1区二区| 成人国产精品一区二区网站| 亚洲午夜精品久久久久久久久久久久| 91麻豆精品国产91久久综合| 亚洲伊人网站| 久久资源亚洲| 成人动漫一区| 亚洲人成亚洲人成在线观看| 日韩精品一区二区亚洲av| caoporen国产精品视频| 免费一级特黄毛片| 欧美日韩精品一区二区三区在线观看| 亚洲精品福利在线观看| 国产亚洲精品成人| 国产91对白在线观看九色| 青青视频免费在线观看| 精品中文字幕一区二区三区四区| 日韩大片在线观看视频| 国产午夜福利精品| 99久久99久久精品免费看蜜桃| 日韩电影天堂视频一区二区| 日韩大尺度黄色| 在线日韩欧美视频| 国产精品爽爽久久久久久| 国产精品久久久久影视| 亚洲无在线观看| 欧美精品啪啪| 精品国产一区二区三区日日嗨 | 久久只精品国产| 黄色高清无遮挡| 色狮一区二区三区四区视频| 国产美女91呻吟求| 18在线观看的| 亚洲国产欧美在线成人app| 欧美一二三区视频| 国产亚洲精品bt天堂精选| 三级一区二区三区| 亚洲大片在线| 奇米精品在线| 深夜福利一区二区三区| 88国产精品欧美一区二区三区| 国产免费福利视频| 亚洲成人精品一区二区| 黄色a一级视频| 美女视频免费一区| 国产激情片在线观看| 色天天色综合| 国产日韩精品在线观看| 国产丝袜在线播放| 一本色道久久综合亚洲精品小说 | 久久电影视频| 欧美裸体一区二区三区| 免费网站看av| 国产日韩欧美精品一区| 特种兵之深入敌后| 久久九九精品| 韩国无码av片在线观看网站| 伊人久久大香线蕉av不卡| 成人性生交大片免费看视频直播 | 欧美精品制服第一页| 先锋av资源站| 制服丝袜日韩国产| 日韩一级片中文字幕| 一二三四社区欧美黄| 色一情一交一乱一区二区三区| 欧美专区18| 9色视频在线观看| 国内精品久久久久久99蜜桃| 91久久夜色精品国产网站| 中文字幕在线直播| 欧美二区乱c黑人| 亚洲s色大片| 国产偷国产偷亚洲清高网站| 精品美女www爽爽爽视频| 成人在线免费看片| 精品视频1区2区| 久久夜靖品2区| 亚洲精品国产精华液| 美国精品一区二区| 久久免费午夜影院| 污污免费在线观看| 国产一区二区三区美女| 久久撸在线视频| 久久看片网站| 免费观看日韩毛片| 亚洲激情女人| 国产精品国产三级国产专区51| 在线欧美激情| 国产精品男人爽免费视频1| 麻豆免费版在线观看| 久久久久久国产免费| 免费av在线| 最近2019好看的中文字幕免费| 国产美女www爽爽爽视频| 在线亚洲一区二区| 国产成人亚洲精品自产在线| 亚洲综合久久久久| 欧美黑吊大战白妞| 亚洲蜜臀av乱码久久精品| www.99re6| 中文字幕一区不卡| 黄色裸体一级片| 国产精品理伦片| 国产精品18在线| 中文字幕中文字幕中文字幕亚洲无线| 成年人性生活视频| 国产成人啪免费观看软件| 能看毛片的网站| 韩国av一区二区三区四区| 国产永久免费网站| 国产一区二区在线视频| 九一精品久久久| 国产精品资源站在线| 手机精品视频在线| 懂色av中文字幕一区二区三区| 成人三级视频在线播放 | 午夜免费电影一区在线观看| 亚洲精品合集| 日本视频一区二区在线观看| 九九视频精品全部免费播放| 日韩av免费电影| 久久免费av| 久久久久久久久影视| 国一区二区在线观看| 日韩精品一区二区在线视频| 亚洲激情亚洲| 男人亚洲天堂网| 免费在线观看不卡| 爽爽爽在线观看| 成人久久视频在线观看| 黄色国产在线观看| 中文字幕精品一区二区三区精品| 成人午夜精品无码区| 91亚洲大成网污www| a天堂中文字幕| 国产精品久久久久久久岛一牛影视| 尤物网站在线观看| 久久精品人人做| 国产美女久久久久久| 午夜视频一区二区| 看黄色一级大片| 日韩一区二区在线播放| 俄罗斯嫩小性bbwbbw| 亚洲欧美激情一区| 国产精品一卡二卡三卡| 69av在线播放| 色999久久久精品人人澡69 | 伊人久久大香线蕉午夜av| 欧美国产免费| 亚洲中文字幕无码不卡电影| 九九热在线视频观看这里只有精品| 免费日韩中文字幕| 国产乱对白刺激视频不卡| 37p粉嫩大胆色噜噜噜| 国产精品国产三级国产aⅴ中文| 制服 丝袜 综合 日韩 欧美| 亚洲另类色综合网站| 青青青国产在线 | mm131午夜| 在线亚洲一区| 中文字幕12页| 久久精品亚洲国产奇米99| 欧美三级 欧美一级| 在线视频中文字幕一区二区| www.五月婷婷| 中文字幕v亚洲ⅴv天堂| 久草在线资源福利站| 亚洲精品免费一区二区三区| 国产精品亚洲二区| 人妻无码一区二区三区四区| 日韩av在线发布| 丰满少妇xbxb毛片日本| 综合自拍亚洲综合图不卡区| 亚洲欧美一区二区三区在线观看| 婷婷久久综合九色综合伊人色| 亚洲一区欧美在线| 欧美喷水一区二区| 精品99又大又爽又硬少妇毛片| 亚洲天堂免费视频| 2021天堂中文幕一二区在线观| 97高清免费视频| 五月亚洲婷婷| 精品91一区二区三区| 日韩精品国产欧美| 超碰97人人干| 亚洲国产成人精品视频| 国产手机视频在线| 久久香蕉频线观| 色8久久久久| 亚洲精品一卡二卡三卡四卡| 亚洲激情网站| 日韩精品视频一区二区| 亚洲一区二区中文在线| 国产aⅴ一区二区三区| 久久精品国产精品亚洲| 国内精品伊人| 亚洲视频在线二区| 日本中文字幕一区二区有限公司| 欧美激情第一区| 国产精品白丝在线| 91av国产精品| 精品久久久av| 四虎影视国产精品| 男女啪啪的视频| 国产伦精一区二区三区| www深夜成人a√在线| 欧美一区二区三区四区五区| 成人无遮挡免费网站视频在线观看 | 成人区人妻精品一区二| 亚洲第一福利一区| 亚洲精品国产一区二| 久久久噜噜噜久久中文字免| 丁香5月婷婷久久| 国产精品入口芒果| 91捆绑美女网站| 免费看污视频的网站| 中文字幕v亚洲ⅴv天堂| 2020国产精品小视频| 在线亚洲美日韩| 国产成人免费xxxxxxxx| 国产在线观看成人| 日韩黄在线观看| 欧美色999| 男女爱爱视频网站| 成人性视频免费网站| 色婷婷在线观看视频| 亚洲精品一区av在线播放| 日韩精品一区二区三区av| 三年中国中文在线观看免费播放| 亚欧成人精品| 我不卡一区二区| 欧美二区三区的天堂| 青春草视频在线| 蜜桃传媒视频麻豆第一区免费观看| 91精品亚洲| 中文字幕一区二区三区乱码不卡| 中文字幕亚洲一区二区va在线| 在线视频一区二区三区四区| 亚洲最大在线视频| 精品国产一区二| 国产精品www在线观看| 久久一区二区三区四区| 一级黄色a毛片| 久久久免费精品视频| 欧美男男gaytwinkfreevideos| 欧美一区二区中文字幕| 国产日产欧美一区| 亚洲精品久久久久久无码色欲四季|