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

Objective-C基礎語法快速入門

移動開發 iOS
假如我們對面向對象的思維已經C語言都很熟悉的話,對于我們學習Objective-C將會非常有用。假如我們對C語言還不熟悉的話,那我們需要學習一下C語言。

2010年11月編程語言排行榜2月編程語言排行榜講的都是Objective-C。Objective-C是Mac軟件開發領域最主要的開發語言,假如我們對面向對象的思維已經C語言都很熟悉的話,對于我們學習Objective-C將會非常有用。假如我們對C語言還不熟悉的話,那我們需要學習一下C語言。

方法調用(Calling Methods)

為了能夠盡快上手,我們先來看一些簡單的例子。Objective-C語法里面基本的方法調用是這樣的:

  1. [object method];  
  2.  
  3. [object methodWithInput:input];  
  4.  

對象的方法可以返回值:

  1. output = [object methodWithOutput];  
  2.  
  3. output = [object methodWithInputAndOutput:input];  
  4.  

我們也可以在類里面調用如何創建對象的方法。下面的這個例子里面,我們調用了NSString類的string方法:

  1. id myObject = [NSString string];  
  2.  

id的類型意味著myObject這個變量可以指向任意類型的變量。當我們編譯這個應用程序的時候,并不知道他實現的真實的類和方法。

在這個例子里面,很明顯這個對象的類型應該是NSString,所以我們可以改一下他的類型:

  1. NSString* myString = [NSString string];  
  2.  

現在myString就是一個NSString類型的變量。這個時候假如我們試圖使用一個NSString沒有實現的方法時,編譯器就會警告我們。

一定要注意在對象類型的右邊有一個星號。所有的Objective-C對象變量都是指針類型的。id類型已經預先被定義成一個指針類型了。所以我們不需要再加星號。

嵌套消息調用(Nested Messages)

在許多編程語言里面嵌套消息,或者嵌套函數看起來就像這樣:

  1. function1 ( function2() );  

function2的返回值被傳遞給function1當輸入參數。在Objective-C里面,嵌套消息調用就像這樣:

  1. [NSString stringWithFormat:[prefs format]];  

我們應該盡量避免在一行代碼里面嵌套調用超過兩個。因為這樣的話,代碼的可讀性就不太好。#p#

多參輸入的方法(Multi-Input Methods)

多個輸入參數的方法。在Objective-C里面,一個方法名可以被分割成幾段。在頭文件里面,就應該這樣子來定義一個多輸入參數的方法:

  1. -(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;  
  2.  

我們這樣來調用它:

  1. BOOL result = [myData writeToFile:@"/tmp/log.txt" atomically:NO];  
  2.  

參數不一定要給它命名。在運行期系統里面這個方法真實的名字叫writeToFile:atomically:。

  1. Accessors(Getter & Setter)  
  2.  

在Objective-C里面所有的實例對象默認都是私有的。所有在大多數情況下我們需要用accessors去讀取或者設置變量的值。有兩個語法都支持這樣的操作,這個時傳統的老的語法:

  1. [photo setCaption:@"Day at the Beach"];  
  2. output = [photo caption];  
  3.  

第二行的代碼其實并非直接去讀對象實例的變量。事實上它調用的是名叫caption的方法。在Objective-C里大多數情況下我們不需要給getters加get的前綴。

無論什么時候我們見到方括號,其實我們都是向一個對象或者一個類發送了一個消息。#p#

Dot Syntax

在Objective-C 2.0里面,新增加了一個"."操作的語法。在Mac OS X 10.5里面就使用了Objective-C 2.0語法:

  1. photo.caption = @"Day at the Beach";  
  2. output = photo.caption;  
  3.  

我們兩種方式都可以使用。但是在一個工程里面最好保持風格一致,只使用某一種。"."操作只能夠被使用在setters和getters里面,而不能用在一般意思的方法上。

創建對象

主要有兩種方式來創建一個對象。第一種辦法像這面這樣:

  1. NSString* myString = [NSString string];  
  2.  

這是一種非常習慣性的風格。在這種方式情況下,我們創建的是系統自動釋放(autoreleased)類型的對象。關于自動釋放類型autoreleased,我們以后會深入討論一下。然而在許多情況下,我們需要手動的去創建對象:

  1. NSString* myString = [[NSString alloc] init];  
  2.  

這是一個嵌套的方法調用。第一個調用的NSString自己的alloc方法。這是一個相對比較底層的調用,因為他創建了內容,以及實例化了一個對象。

第二塊代碼調用了新創建對象的init方法。這個init方法實現了比較常用的基本設置,比如創建實例對象的參數。對于一般開發人員而言,實現這個客戶的類的具體的細節并不清楚。

在一些情況下,我們可以用不通的初始化方式去賦初值:

  1. NSNumber* value = [[NSNumber alloc] initWithFloat:1.0];  
  2.  

基本的內存管理

假如我們正在為Mac OS X開發一個應用程序,我們可以選擇是否啟用垃圾回收機制。這就意味著我們不需要去考慮內存管理,除了一個特別復雜的情形我們需要處理一下。

然而,我們有的時候我們的開發環境沒有垃圾回收機制,比如iPhone開發的時候就沒有垃圾回收機制。在這種情況下,我們就需要了解一些基本的內存管理方面的概念。

假如我們手動的通過alloc創建了一個對象,我們需要用完這個對象后release它。我們不需要手動的去release一個autoreleased類型的對象,假如真的這樣去做的話,我們的應用程序將會crash。

這里有兩個例子:

  1. // string1 will be released automatically  
  2.  
  3. NSString* string1 = [NSString string];  
  4.  
  5. // must release this when done  
  6.  
  7. NSString* string2 = [[NSString alloc] init];  
  8.  
  9. [string2 release];  
  10.  

就這個教程而言,我們可以人為autoreleased對象會在當前函數方法調用完成后被釋放。

當然了,還有很多關于內存管理的只是我們需要學習,但是這需要我們了解更多的基本概念以后才能去涉及。#p#

設計一個類的Interface

就Objective-C語言而言,創建一個類非常簡單。它非常典型的分成了兩個部分。

類的接口通常保存在ClassName.h文件里,它定義了實例的參數,以及一些公開的方法。

類的實現在ClassName.m文件里。它包含了真正運行的代碼和那些方法。它還經常定義一些私有的方法。這些私有的方法對于子類是不可見的。

這里有一個接口文件的大概。類名Photo,所以文件名叫Photo.h:

  1. #import  
  2.  
  3. @interface Photo : NSObject {  
  4.  
  5. NSString* caption;  
  6.  
  7. NSString* photographer;  
  8.  
  9. }  
  10.  
  11. @end  
  12.  

首先,我們把Cocoa.h import進來。Cocoa的應用程序的所有的基本的類大多都是這樣做的。#import宏指令會自動的避免把同一個文件包含多次。

@interface符號表明這是Photo類的聲明。冒號指定了父類。上面這個例子父類就是NSObject。

在大括弧里面,有兩個變量:caption和photographer。兩個都是NSString類型的。當然了,他們也可以是任何別的類型包括id類型的。

最后@end結束整個聲明。

增加方法

讓我們為成員變量加一些getters:

  1. #import  
  2.  
  3. @interface Photo : NSObject {  
  4.  
  5. NSString* caption;  
  6.  
  7. NSString* photographer;  
  8.  
  9. }  
  10.  
  11. - caption;  
  12.  
  13. - photographer;  
  14.  
  15. @end  
  16.  

別忘記,Objective-C方法不需要加get前綴。一個單獨小橫桿表明它是一個實例的方法。假如是一個加號的話,那就說明它是一個類的方法。

編譯器默認的方法的返回類型為id。還有所有的方法的參數的默認類型也都是id類型的。所以上面的代碼從技術上講是對的。但是很少這么用。我們還是給它加上返回類型吧:

  1. #import  
  2.  
  3. @interface Photo : NSObject {  
  4.  
  5. NSString* caption;  
  6.  
  7. NSString* photographer;  
  8.  
  9. }  
  10.  
  11. - (NSString*) caption;  
  12.  
  13. - (NSString*) photographer;  
  14.  
  15. @end  
  16.  

下面我們再加上setters:

  1. #import  
  2.  
  3. @interface Photo : NSObject {  
  4.  
  5. NSString* caption;  
  6.  
  7. NSString* photographer;  
  8.  
  9. }  
  10.  
  11. - (NSString*) caption;  
  12.  
  13. - (NSString*) photographer;  
  14.  
  15. - (void) setCaption: (NSString*)input;  
  16.  
  17. - (void) setPhotographer: (NSString*)input;  
  18.  
  19. @end  
  20.  

Setters不需要返回任何值,所以我們把它的類型指定為void.#p#

類的實現

我們通過實現getters來創建一個類的實現:

  1. #import "Photo.h"  
  2.  
  3. @implementation Photo  
  4.  
  5. - (NSString*) caption {  
  6.  
  7. return caption;  
  8.  
  9. }  
  10.  
  11. - (NSString*) photographer {  
  12.  
  13. return photographer;  
  14.  
  15. }  
  16.  
  17. @end  
  18.  

這部分的代碼由@implementation再來加上類名開始,以@end結束。就跟類的接口定義一樣,所有的方法跟接口定義里的一樣。所有的對象都必要既要定義也要實現。

假如我們以前也寫過代碼的話,Objective-C里面的getters看上去跟別的差不多。所以我們下面就來介紹setters,它需要一點說明。

  1. - (void) setCaption: (NSString*)input  
  2.  
  3. {  
  4.  
  5. [caption autorelease];  
  6.  
  7. caption = [input retain];  
  8.  
  9. }  
  10.  
  11. - (void) setPhotographer: (NSString*)input  
  12.  
  13. {  
  14.  
  15. [photographer autorelease];  
  16.  
  17. photographer = [input retain];  
  18.  
  19. }  
  20.  

每個setter處理兩個變量。第一個是當前存在對象的應用。第二個是新的輸入對象。在支持垃圾回收的開發環境里,我們只要直接賦新值就可以了:

  1. - (void) setCaption: (NSString*)input {  
  2.  
  3. caption = input;  
  4.  
  5. }  
  6.  

但是假如我們不可以用垃圾回收機制的話,我們就需要先retain舊的對象,然后retain新的對象。

有兩種方法可以釋放一個引用對象:release 和 autorelease。標準的release會直接刪除引用。autorelease方法會在將來的某個時候去release它。在它聲明周期結束前,它會毫無疑問的存在。在本例中,上面setPhotographer中的photographer對象,將會在函數結束的時候被釋放。

在setter里面用autorelease是安全的,因為新對象跟老的對象有可能是同一個對象有可能指向的是同一個對象。對于一個我們即將retain的對象,我們不應該立即release它。

這個也許現在看起來會困惑,但是隨著我們的學習,會越來越能理解它。現在我們不需要立刻完全理解它。#p#

初始化

我們可以創建一個初始化方法去給類的實例的成員變量賦初值:

  1. - (id) init  
  2.  
  3. {  
  4.  
  5. if ( self = [super init] )  
  6.  
  7. {  
  8.  
  9. [self setCaption:@"Default Caption"];  
  10.  
  11. [self setPhotographer:@"Default Photographer"];  
  12.  
  13. }  
  14.  
  15. return self;  
  16.  
  17. }  
  18.  

上面的代碼感覺沒啥好解釋的,雖然第二行代碼好像看上去沒啥用。這個是一個單等于號,就是把[super init]的值賦給了self。

它基本上是在調用父類去實現它的初始化。這個if代碼段是設置默認值之前驗證初始化是否成功。

釋放資源Dealloc

這個dealloc方法是在當一個對象希望被從內容里面刪除的時候調用。這個我們釋放在子類里面引用成員變量的最好的時機:

  1. - (void) dealloc  
  2.  
  3. {  
  4.  
  5. [caption release];  
  6.  
  7. [photographer release];  
  8.  
  9. [super dealloc];  
  10.  
  11. }  
  12.  

開始兩行我們發送了release通知給了兩個成員變量。我們不要在這里用autorelease。用標準的release更快一點。

最后一行的[super dealloc];非常重要。我們必須要發送消息去讓父類清除它自己。假如不這么做的話,這個對象其實沒有被清除干凈,存在內存泄露。

dealloc在垃圾回收機制下不會被調用到。取而代之的是,我們需要實現finalize方法。#p#

更多關于內存管理

Objective-C的內存管理系統基于引用記數。所有我們需要關心的就是跟蹤我們引用,以及在運行期內是否真的釋放了內存。

用最簡單的術語來解釋,當我們alloc一個對象的時候,應該在某個時候retain了它。每次我們調用了alloc或者retain之后,我們都必須要調用release。

這就是引用記數理論。但是在實踐的時候,只有兩種情況我們需要創建一個對象:

1. 成為一個類的成員變量

2. 只臨時的在一個函數里面被使用

在更多的時候,一個成員變量的setter應該僅僅autorelease舊的對象,然后retain新的對象。我們只需要在dealloc的時候調用release就可以了。

所以真正需要做的就是管理函數內部的local的引用。唯一的原則就是:假如我們alloc或者copy了一個對象,那么我們在函數結束的時候需要release或者autorelease它。假如我們是通過別的方式創建的,就不管。

這里是管理成員對象的例子:

  1. - (void) setTotalAmount: (NSNumber*)input  
  2.  
  3. {  
  4.  
  5. [totalAmount autorelease];  
  6.  
  7. totalAmount = [input retain];  
  8.  
  9. }  
  10.  
  11. - (void) dealloc  
  12.  
  13. {  
  14.  
  15. [totalAmount release];  
  16.  
  17. [super dealloc];  
  18.  
  19. }  
  20.  

這里是本地引用的例子。我們只需要release我們用alloc創建的對象:

  1. NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];  
  2.  
  3. NSNumber* value2 = [NSNumber numberWithFloat:14.78];  
  4.  
  5. // only release value1, not value2  
  6.  
  7. [value1 release];  
  8.  

這里是用本地引用對象去設一個成員變量的例子:

  1. NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];  
  2.  
  3. [self setTotal:value1];  
  4.  
  5. NSNumber* value2 = [NSNumber numberWithFloat:14.78];  
  6.  
  7. [self setTotal:value2];  
  8.  
  9. [value1 release];  
  10.  

注意到如何管理本地引用其實都是一樣的。不管你是否把它設給了一個成員變量。我們無須考慮setters的內部實現。

如果我們很好的理解了這些的話,我們基本上理解了80%的Objective-C內存管理方面的內容了。#p#

屬性Properties

前面我們寫caption和author的accessors的時候,你可以已經注意到了代碼非常簡明,應該可以被抽象提取出來。

屬性在Objective-C里是一個新的功能。他可以讓我們自動的生成accessors,另外還有一些別的優點。我們可以把上面Photo的類轉成用屬性來實現:

上面那個類原先的實現是這樣:

  1. #import  
  2.  
  3. @interface Photo : NSObject {  
  4.  
  5. NSString* caption;  
  6.  
  7. NSString* photographer;  
  8.  
  9. }  
  10.  
  11. - (NSString*) caption;  
  12.  
  13. - (NSString*) photographer;  
  14.  
  15. - (void) setCaption: (NSString*)input;  
  16.  
  17. - (void) setPhotographer: (NSString*)input;  
  18.  
  19. @end  
  20.  

假如用屬性來實現就是這樣:

  1. #import  
  2.  
  3. @interface Photo : NSObject {  
  4.  
  5. NSString* caption;  
  6.  
  7. NSString* photographer;  
  8.  
  9. }  
  10.  
  11. @property (retain) NSString* caption;  
  12.  
  13. @property (retain) NSString* photographer;  
  14.  
  15. @end  
  16.  

@property是Objective-C來聲明屬性的編譯指令。括號里面的"retain"指明了setter需要retain輸入的對象。這行其他的部分指定了屬性的類型以及名字。

下面讓我們來看看這個類的實現:

  1. #import "Photo.h"  
  2.  
  3. @implementation Photo  
  4.  
  5. @synthesize caption;  
  6.  
  7. @synthesize photographer;  
  8.  
  9. - (void) dealloc  
  10.  
  11. {  
  12.  
  13. [caption release];  
  14.  
  15. [photographer release];  
  16.  
  17. [super dealloc];  
  18.  
  19. }  
  20.  
  21. @end  
  22.  

@synthesize指令自動的生成了我們的setters和getters。所以我們只需要實現類的dealloc方法。

Accessors只有當他們原先沒有的時候,才會被生成。所以可以放心大膽的去用@synthesize來指定屬性。而且可以隨意實現你自己的getter和setter。編譯器會自己去找哪個方法沒有。

屬性聲明還有別的選項,但是限于篇幅層次,我們下次再介紹。

Logging

在Objective-C里,往console寫日記非常簡單。事實上NSLog()跟C語言的printf()兩個函數幾乎完全相同,除了NSLog是用額外的“%@”去獲得對象。

  1. NSLog ( @"The current date and time is: %@", [NSDate date] );  
  2.  

我們可以log一個對象到console里去。NSLog函數調用要輸出對象的description方法,然后打印返回的NSString。我們可以在自己的類里重寫description方法,這樣我們就可以得到一個自定義的字符串。#p#

調用nil對象的方法(Calling Methods on Nil)

在Objective-C里,nil對象被設計來跟NULL空指針關聯的。他們的區別就是nil是一個對象,而NULL只是一個值。而且我們對于nil調用方法,不會產生crash或者拋出異常。

這個技術被framework通過多種不同的方式使用。最主要的就是我們現在在調用方法之前根本無須去檢查這個對象是否是nil。假如我們調了nil對象的一個有返回值的方法,那么我們會得到一個nil返回值。

我們可以通過nil對象讓我們的dealloc函數實現看上去更好一些:

  1. - (void) dealloc  
  2. {  
  3. self.caption = nil;  
  4. self.photographer = nil;  
  5. [super dealloc];  
  6. }  
  7.  

之所以可以這么做是因為我們給把nil對象設給了一個成員變量,setter就會retain nil對象(當然了這個時候nil對象啥事情也不會做)然后release舊的對象。這個方式來釋放對象其實更好,因為這樣做的話,成員變量連指向隨機數據的機會都沒有,而通過別的方式,出現指向隨機數據的情形機會不可避免。

注意到我們調用的self.VAR這樣的語法,這表示我們正在用setter,而且不會引起任何內存問題。假如我們直接去設值的話,就會有內存溢出:

  1. // incorrect. causes a memory leak.  
  2. // use self.caption to go through setter  
  3. caption = nil;  
  4.  

Categories

Categories是Objective-C里面最常用到的功能之一。 基本上category可以讓我們給已經存在的類增加方法,而不需要增加一個子類。而且不需要知道它內部具體的實現。

如果我們想增加某個framework自帶的類的方法,這非常有效。如果我們想在我們程序工程的NSString能夠增加一個方法,我們就可以使用category。甚至都不需要自己實現一個NSString的子類。

比如,我們想在NSString里面增加一個方法來判斷它是否是一個URL,那我們就可以這么做:

  1. #import  
  2.  
  3. @interface NSString (Utilities)  
  4.  
  5. - (BOOL) isURL;  
  6.  
  7. @end  
  8.  

這跟類的定義非常類似。區別就是category沒有父類,而且在括號里面要有category的名字。名字可以隨便取,但是習慣叫法會讓人比較明白category里面有些什么功能的方法。

這里是具體的實現。但是要注意,這本身并不是一個判斷URL很好的實現。我們主要是為了整體的了解category的概念。

  1. #import "NSString-Utilities.h"  
  2.  
  3. @implementation NSString (Utilities)  
  4.  
  5. - (BOOL) isURL  
  6.  
  7. {  
  8.  
  9. if ( [self hasPrefix:@"http://"] )  
  10.  
  11. return YES;  
  12.  
  13. else  
  14.  
  15. return NO;  
  16.  
  17. }  
  18.  
  19. @end  
  20.  

現在我們可以在任何的NSString類對象里都可以調用這個方法了。下面的代碼在console里面打印的"string1 is a URL":

  1. NSString* string1 = @"http://www.CocoaDev.cn/";  
  2.  
  3. NSString* string2 = @"Pixar";  
  4.  
  5. if ( [string1 isURL] )  
  6.  
  7. NSLog (@"string1 is a URL");  
  8.  
  9. if ( [string2 isURL] )  
  10.  
  11. NSLog (@"string2 is a URL");  
  12.  

跟子類不一樣,category不能增加成員變量。我們還可以用category來重寫類原先的存在的方法,但是這需要非常非常小心。

記住,當我們通過category來修改一個類的時候,它對應用程序里的這個類所有對象都起作用。

后記

上面Objective-C的比較基礎的大概的講了一下。Objective-C還是比較好上手的。沒有特別的語法需要去學習。而且一些概念在Objective-C里面被反復運用。

責任編輯:佚名 來源: zheku8
相關推薦

2011-05-11 13:54:08

Objective-C

2014-04-30 10:16:04

Objective-CiOS語法

2011-07-18 16:36:51

Objective-C XCode

2011-07-06 11:19:45

Objective-C

2011-08-17 11:15:22

Objective-C語法

2011-05-11 15:58:34

Objective-C

2011-08-02 13:16:36

Objective-C 語法 函數

2011-08-09 15:53:28

2011-05-11 15:45:50

內存管理Objective-C

2011-08-04 14:58:37

Objective-C Cocoa NSString

2011-07-06 14:12:14

Objective-C

2011-08-10 19:16:50

Objective-C變量

2010-11-24 10:35:40

Objective-C

2014-04-15 11:27:50

C++開發者Objective-C核心語法

2011-05-11 15:19:01

CocoaObjective-C

2011-04-08 10:51:17

Objective-CiOS

2011-08-18 15:19:28

XcodeObjective-C語法

2011-07-06 14:41:34

Objective-C

2015-11-02 10:13:41

iOSObjective-C語法

2015-06-25 11:21:33

C++Objective-C
點贊
收藏

51CTO技術棧公眾號

久久亚洲国产精品日日av夜夜| 欧美日韩国产美| 久久久久久国产精品一区| 91蜜桃视频在线观看| 亚洲深夜福利在线观看| 欧美日韩在线三区| 青青草视频在线视频| 亚洲人妻一区二区三区| 奇米影视在线99精品| 欧美巨大黑人极品精男| 影音先锋人妻啪啪av资源网站| 欧美大胆成人| 亚洲欧美视频在线观看视频| 国产日韩在线一区二区三区| 波多野结衣黄色| 欧美1区视频| 亚洲欧美国产精品| 国产女同无遮挡互慰高潮91| 国内高清免费在线视频| 国产亚洲精品aa午夜观看| 国产主播喷水一区二区| 国产69精品久久久久久久久久| 日韩欧美不卡| 亚洲国产小视频| 污污的视频免费观看| 麻豆mv在线看| 一区二区三区在线免费| 日韩三级电影| 五月婷婷六月丁香| 国产伦精品一区二区三区视频青涩| 26uuu亚洲伊人春色| 久久久.www| 日韩精品水蜜桃| 亚洲欧美激情在线视频| 丰满少妇xbxb毛片日本| 91国产精品| 在线观看免费亚洲| 分分操这里只有精品| 91精品久久| 国产精品久久久久aaaa| 欧美一区二区三区在线播放 | 亚洲区综合中文字幕日日| 亚洲精品在线不卡| 岛国精品资源网站| 中文字幕一区二区三区四区久久 | 欧美日本啪啪无遮挡网站| 国产毛片欧美毛片久久久| 五月国产精品| 亚洲第一区在线| 国产ts在线观看| 韩国三级成人在线| 欧美一区二区三区在线观看| 污污动漫在线观看| se69色成人网wwwsex| 色婷婷国产精品综合在线观看| 国产97在线 | 亚洲| 久久大胆人体| 亚洲午夜av在线| 日韩一级免费看| 伊人影院在线视频| 亚洲蜜桃精久久久久久久| 特级黄色录像片| a天堂中文在线官网在线| 亚洲男人的天堂在线aⅴ视频| 一区二区视频在线播放| 国产一区久久精品| 一区二区在线电影| www插插插无码免费视频网站| 羞羞的视频在线看| 亚洲午夜久久久久| 日韩精品视频一区二区在线观看| 久久久久久久| 在线免费不卡视频| 国产一区二区在线观看免费视频| 亚洲午夜国产成人| 欧美成人精品高清在线播放| 黄色av网址在线观看| 午夜a一级毛片亚洲欧洲| 亚洲三级黄色在线观看| 一级特黄曰皮片视频| 日韩理论电影院| 久久夜色精品国产欧美乱| 精品处破女学生| 99精品久久久| 国产精品久久99久久| 国产精品毛片一区二区在线看舒淇| 国产在线精品国自产拍免费| 国产精品国产亚洲精品看不卡15| 四虎在线视频| 国产精品天美传媒沈樵| 日韩精品手机在线观看| 国产传媒在线| 欧美视频完全免费看| 四川一级毛毛片| 农村少妇一区二区三区四区五区 | 成a人片在线观看www视频| 国产精品视频一二三| 亚洲一区 在线播放| 麻豆免费版在线观看| 欧美中文字幕不卡| 91精品国产高清91久久久久久 | 亚洲国产一区二区三区四区| 在线观看免费黄色网址| 欧美日韩精品| 国产精品扒开腿做| 午夜精品久久久久久久99热黄桃| 久久你懂得1024| 9l视频自拍9l视频自拍| 小h片在线观看| 9191成人精品久久| 亚洲 欧美 日韩在线| 国产精品7m凸凹视频分类| 久久久久国色av免费观看性色| 欧美亚洲另类小说| 国产成人亚洲精品狼色在线| 日韩中文一区二区三区| a级片免费在线观看| 欧美男人的天堂一二区| www.超碰97| 中文字幕一区二区三三| 国产精品av电影| 免费国产羞羞网站视频| 国产精品久久久久精k8| 日韩精品一区中文字幕| 久久精品色综合| 欧美乱妇高清无乱码| 中文在线观看av| 91视频一区二区| 中文字幕日韩精品无码内射| 黄色成人小视频| 精品小视频在线| 国产精品不卡av| 激情伊人五月天久久综合| 日本在线观看不卡| 在线视频超级| 亚洲精品二三区| 久草视频在线免费看| 久久99精品久久久久婷婷| 色噜噜色狠狠狠狠狠综合色一| 白浆视频在线观看| 精品久久久久久最新网址| 午夜国产福利一区二区| 久久草av在线| 亚洲视频在线二区| 精品成人av| 亚洲视频视频在线| 中文字幕黄色片| 久久综合狠狠综合| 国产 福利 在线| 美女主播精品视频一二三四| 国内偷自视频区视频综合| 亚洲av少妇一区二区在线观看| 亚洲欧美日韩在线不卡| 日韩欧美理论片| 91精品秘密在线观看| 成人h猎奇视频网站| 日本在线免费| 91.成人天堂一区| 四虎884aa成人精品| 精品一区二区久久| 国产高清免费在线| 无人区乱码一区二区三区| 欧美不卡视频一区发布| 午夜精品久久久久久久96蜜桃| 亚洲自拍偷拍麻豆| 偷偷色噜狠狠狠狠的777米奇| 日韩视频三区| 免费观看成人高| 欧美不卡高清一区二区三区| 综合136福利视频在线| 亚洲在线免费观看视频| 亚洲天堂免费在线观看视频| 男人添女人荫蒂国产| 在线国产精品一区| 开心色怡人综合网站| 91精品影视| 日韩在线视频中文字幕| 国产女人高潮毛片| 亚洲一区二三区| 北岛玲一区二区| 日本成人在线一区| 天天干天天操天天干天天操| 精品中文字幕一区二区三区| 欧美精品激情在线观看| 免费国产在线观看| 欧美色涩在线第一页| 欧美日韩免费做爰视频| 99国产精品一区| the porn av| 韩日在线一区| 日本高清久久一区二区三区| 成人永久在线| 欧美一区三区三区高中清蜜桃| 二区在线视频| 欧美大片顶级少妇| 国产又粗又猛又黄视频| 亚洲美女在线国产| 一级黄色片大全| 美国一区二区三区在线播放| 拔插拔插海外华人免费| 成人区精品一区二区婷婷| 99国产精品久久久久老师| 亚洲同志男男gay1069网站| 北条麻妃在线一区二区| 日日夜夜精品免费| 欧美日韩国产成人在线免费| 日韩成人免费观看| 亚洲婷婷国产精品电影人久久| 蜜桃精品成人影片| 国产精品99久久久久久似苏梦涵| 国产成人久久婷婷精品流白浆| 影视亚洲一区二区三区| 日本视频一区二区在线观看| japanese色系久久精品| 国产在线精品播放| 婷婷六月国产精品久久不卡| 色综合久久久久久中文网| 东热在线免费视频| 亚洲激情视频在线播放| 国产毛片毛片毛片毛片| 色88888久久久久久影院按摩| 久久久久久久久久综合| 亚洲丝袜精品丝袜在线| 精品人妻无码一区| 91蜜桃传媒精品久久久一区二区| 肉丝美足丝袜一区二区三区四| 久久超碰97中文字幕| 日本xxxxxxx免费视频| 亚洲伊人观看| 国产精品www在线观看| 亚洲mv大片欧洲mv大片| 色涩成人影视在线播放| 蜜桃精品噜噜噜成人av| 精品不卡一区二区三区| 中文字幕日韩高清在线| 亚洲一区二区三区在线免费观看| 日本亚洲欧洲无免费码在线| 国产精品成人品| 亚洲高清黄色| 欧洲日韩成人av| 少妇视频在线观看| 午夜精品久久久久久久男人的天堂 | 亚洲国产高清福利视频| 精品人妻aV中文字幕乱码色欲| 欧美久久久久中文字幕| 中文无码av一区二区三区| 91黄色免费网站| 国产剧情在线视频| 色综合天天综合网天天看片 | 欧美日韩视频在线一区二区 | 日韩午夜精品电影| 国产乱色精品成人免费视频| 欧美精品乱码久久久久久| 亚洲综合免费视频| 欧美日本国产视频| 一区二区三区www污污污网站| 欧美日本一区二区三区四区| 亚洲一区中文字幕永久在线| 欧美日韩精品一区二区在线播放| 精品国产青草久久久久96| 在线欧美日韩国产| 国产一区二区三区中文字幕| 欧美精品高清视频| 成人激情四射网| 亚洲国产精彩中文乱码av| 天天摸夜夜添狠狠添婷婷| 日韩精品在线视频观看| 国产尤物视频在线| 少妇高潮 亚洲精品| 成人在线app| 欧美日韩成人在线观看| 阿v视频在线观看| 国产成人精品在线| 日韩成人在线一区| 99www免费人成精品| 日本亚洲不卡| 性欧美精品一区二区三区在线播放| 婷婷成人基地| 人妻少妇精品久久| 日韩制服丝袜先锋影音| 国产精品国产福利国产秒拍| 韩国三级一区| 91深夜福利视频| 里番精品3d一二三区| 日本免费高清一区| 亚洲先锋影音| 免费观看日韩毛片| 精品系列免费在线观看| 蜜臀av粉嫩av懂色av| 国产亚洲1区2区3区| 国产三级国产精品国产国在线观看| 亚洲一区二区精品视频| 一级黄色大片视频| 56国语精品自产拍在线观看| 蜜臀av在线观看| 一区二区三区日韩在线| 色婷婷视频在线观看| 欧美专区在线观看| 日韩精品一区国产| 青娱乐一区二区| 欧美 日韩 国产精品免费观看| www国产黄色| 国产精品99久久久久久似苏梦涵| 国产av自拍一区| 亚洲一区在线观看免费| 久久国产香蕉视频| 欧美精品一区二区三区久久久 | 97一区二区国产好的精华液| 欧美精品v日韩精品v国产精品| 91tv官网精品成人亚洲| 国产成人综合一区| av在线不卡电影| 亚洲视频重口味| 色噜噜狠狠一区二区三区果冻| www.成人精品| 久久精品国产99国产精品澳门| 亚洲一二三四| 国产精品日韩一区二区三区| 午夜国产一区二区| 日韩欧美在线免费观看视频| yourporn久久国产精品| 全程偷拍露脸中年夫妇| 欧洲av一区二区嗯嗯嗯啊| 香蕉视频免费看| 欧美国产日韩一区二区三区| 色综合视频一区二区三区44| 欧美日韩一区在线视频| 1024日韩| 中文字幕在线播放一区二区| 中文字幕中文字幕一区二区| 亚洲国产无线乱码在线观看| 亚洲男人av电影| 擼擼色在线看观看免费| 国产精品一区二区欧美| 午夜日本精品| 伦伦影院午夜理论片| 中文字幕一区二区三区在线播放 | 女性裸体视频网站| 在线观看成人小视频| 青青久草在线| 57pao成人国产永久免费| 欧美大胆视频| 国产视频一视频二| 成人激情午夜影院| 国产精品成人国产乱| 亚洲国产成人一区| 都市激情国产精品| 好吊妞www.84com只有这里才有精品 | 国产成人在线免费观看| 青娱乐国产精品| 日韩欧美成人一区二区| 色呦呦呦在线观看| 国产精品一区二区三区观看| 在线精品一区| 国产黄色三级网站| 黑人精品xxx一区| 久久电影视频| 国产精品视频专区| 欧美电影免费播放| 999久久久精品视频| 亚洲男同1069视频| 六月婷婷综合网| 97久久久免费福利网址| 欧美在线导航| 黑森林福利视频导航| 欧美国产在线观看| 一级黄色片免费看| 欧美老肥婆性猛交视频| 女人抽搐喷水高潮国产精品| 日日摸天天爽天天爽视频| 国产精品视频免费看| 国产成人三级一区二区在线观看一 | 欧美亚洲国产一区二区三区| 一级毛片视频在线| 国产91色在线|亚洲| 国产精品久久久久久模特| 欧美另类z0zx974| 日韩午夜在线影院| 欧美调教sm| 亚洲国产精品123| 国产精品自拍一区| 亚洲伊人成人网| 中文字幕日韩在线播放| 日韩三级久久| 免费毛片小视频| 1区2区3区欧美| 日本激情一区二区三区| 国产成人精品免费视频| 中文一区一区三区免费在线观看| 男人网站在线观看| 欧美手机在线视频| 欧美草逼视频| 日韩欧美精品在线不卡| 国产成人福利片| 久久久久久久亚洲| 欧美乱妇高清无乱码| 欧洲福利电影| 91超薄肉色丝袜交足高跟凉鞋| 欧美在线观看视频一区二区 | 国产经典一区二区|