精品欧美一区二区三区在线观看 _久久久久国色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亚洲一区| 久久九九国产精品| 国产欧美久久久久久| 国精品人伦一区二区三区蜜桃| 成人午夜在线| 一区二区三区久久| 精品乱码一区| 久久久精品国产sm调教网站| 红杏一区二区三区| 欧美性生活大片免费观看网址| 欧美精品尤物在线| 一级黄色大片免费观看| 亚洲mv大片欧洲mv大片| 日韩视频中午一区| 欧美日韩激情视频在线观看| 都市激情在线视频| 九九国产精品视频| 国内精品久久久久久中文字幕| 久久人人妻人人人人妻性色av| 深夜在线视频| 国产精品久久久久久久久图文区| **亚洲第一综合导航网站| 久久成人在线观看| 97久久综合区小说区图片区| 精品久久久久久久久国产字幕| 欧美黑人3p| 精品国产99久久久久久宅男i| 在线欧美福利| 中文字幕久热精品在线视频| 极品白嫩的小少妇| 国产成人午夜性a一级毛片| 一区二区三区四区五区视频在线观看 | 欧美久久久久久| 国产女人高潮毛片| 久久激情婷婷| 色综合久久久久久中文网| 在线免费观看黄色小视频| 色综合视频一区二区三区44| 婷婷丁香久久五月婷婷| 亚洲一区二区精品在线| 天堂在线观看av| 国模无码大尺度一区二区三区| 4k岛国日韩精品**专区| 国产日韩欧美在线观看视频| 视频小说一区二区| 欧美午夜精品免费| 欧美综合在线播放| 国产美女福利在线| 亚洲国产高清不卡| 成人伊人精品色xxxx视频| 成人毛片在线播放| 亚洲精品乱码| 久久av在线看| 日韩精品久久久久久久的张开腿让| 精品福利网址导航| 日韩欧美国产高清| 九九热免费在线观看| av在线网页| 曰韩精品一区二区| 椎名由奈jux491在线播放| 看电影就来5566av视频在线播放| 豆国产96在线|亚洲| 92裸体在线视频网站| 人妻中文字幕一区二区三区| 欧美大片一区| 亚洲精品国偷自产在线99热| 免费一级特黄特色毛片久久看| 午夜在线视频免费| 另类小说综合欧美亚洲| 精品少妇v888av| 国产精品免费在线视频| 成人一级毛片| 日韩精品福利网站| 你懂的在线观看网站| jazzjazz国产精品久久| 日韩一区二区三区四区五区六区| 九九热精品国产| 成人午夜一级| 欧美浪妇xxxx高跟鞋交| 青青草原av在线播放| www.51av欧美视频| 日韩欧美国产免费播放| 妞干网视频在线观看| 美足av综合网| 午夜精品久久久久久久99樱桃| 国产免费一区二区视频| 国产福利在线免费观看| 亚洲一区二区高清| 国产美女在线一区| 一区二区电影免费观看| 欧美性高跟鞋xxxxhd| 北条麻妃在线一区| 在线观看爽视频| 色婷婷精品久久二区二区蜜臀av | 婷婷国产在线| 久久久久99精品一区| 亚洲欧洲一区二区在线观看| 黄色在线播放网站| 亚洲一区二区3| 国产精品秘入口18禁麻豆免会员| 成人性生交大片免费网站| 日韩欧美在线国产| www国产精品内射老熟女| 黑人巨大精品| 制服.丝袜.亚洲.另类.中文| 波多野结衣电影免费观看| 大桥未久女教师av一区二区| 亚洲女人被黑人巨大进入| 免费看的黄色录像| 欧美日韩综合| 57pao成人永久免费视频| 日韩欧美国产另类| 国产福利一区二区三区在线视频| 国产99在线免费| 你懂的在线视频| 1000精品久久久久久久久| 欧美图片激情小说| 二吊插入一穴一区二区| 欧美一级日韩一级| 国产精品三级在线观看无码| 日韩一区三区| 97avcom| 91麻豆精品在线| 蜜桃免费网站一区二区三区| 99久久国产免费免费| 日本一本草久在线中文| 中文字幕一区日韩精品欧美| 欧美大片在线播放| 国产成人精品一区二区三区视频| 欧美r级在线观看| 变态另类ts人妖一区二区| 一区二区不卡| 国产成人精品999| 精品欧美在线观看| 91首页免费视频| 91大学生片黄在线观看| 日本.亚洲电影| 亚洲精品久久久久中文字幕欢迎你 | 都市激情久久久久久久久久久| 嫩草研究院在线观看| 一区二区三区久久| 午夜视频在线网站| 精品欧美久久| 性色av一区二区咪爱| 国产片在线播放| 欧美国产激情一区二区三区蜜月| av网站大全免费| 国产精品777777在线播放| 亚洲亚裔videos黑人hd| av大片免费在线观看| 国产真实乱对白精彩久久| 亚洲精品成人久久久998| 欧美大胆性生话| 亚洲精品久久久久中文字幕欢迎你| 日本黄色小说视频| 久久99国产精品久久| 水蜜桃亚洲精品| 日本三级一区| 亚洲国产精彩中文乱码av在线播放| 国产高潮国产高潮久久久91| 久久精品国产成人一区二区三区| 日韩福利视频| 自拍视频在线看| 亚洲精品国产精品国自产在线 | 亚州精品视频| 久久久亚洲成人| 亚洲精品视频网| 亚洲综合丝袜美腿| 中文字幕55页| 一区二区日韩欧美| 亚洲wwwav| av在线影院| 日韩欧美在线1卡| 欧美日韩在线国产| 国产精品综合视频| 欧美极品少妇无套实战| 一本色道69色精品综合久久| 欧美精品日韩www.p站| a毛片在线免费观看| 亚洲色图欧美激情| 佐佐木明希电影| 中文高清一区| 久久综合福利| 日韩欧美精品电影| 爽爽爽爽爽爽爽成人免费观看| 国产精品51麻豆cm传媒| 最新久久zyz资源站| 亚洲欧美手机在线| 欧美日韩国内| 精品国产免费久久久久久尖叫| av在线视屏| 国产午夜一区二区| 亚洲国产999| 日本黄色一区二区| 在线免费日韩av| 久久久久久久久久美女| 奇米777在线视频| 麻豆久久精品| 永久免费网站视频在线观看| 亚洲色图丝袜| 亚洲综合在线做性| 亚洲国产尤物| 韩国v欧美v日本v亚洲| 69xxxx欧美| 日韩精品免费视频| 国产高清免费av| 欧美三区免费完整视频在线观看| 日本一级黄色录像| 国产精品灌醉下药二区| 国产制服丝袜在线| 国产毛片精品国产一区二区三区| 虎白女粉嫩尤物福利视频| 国内精品久久久久久久影视麻豆| 色噜噜一区二区| 丝袜美腿综合| 成人自拍爱视频| 电影91久久久| 国产拍精品一二三| 欧美第一视频| 国语自产精品视频在线看一大j8| 日本激情视频在线观看| 亚洲欧美一区二区精品久久久| 亚洲国产精品久久久久久久| 欧美日韩国产综合久久| 4438国产精品一区二区| 亚洲成av人片在线| 久久久精品国产sm调教| 亚洲欧美一区二区三区久本道91| 国产视频不卡在线| 久久亚洲私人国产精品va媚药| av黄色一级片| 成人国产一区二区三区精品| 性生活在线视频| 精品一区二区三区免费观看| 别急慢慢来1978如如2| 西西人体一区二区| 日韩欧美视频网站| 亚洲精选一区| 欧美老熟妇喷水| 亚洲一区二区三区免费在线观看| 岛国大片在线播放| 国模大胆一区二区三区| 日韩视频 中文字幕| 欧美日韩视频| 久久在线中文字幕| 亚洲美女黄网| 黄页免费在线观看视频| 99日韩精品| 干日本少妇首页| 免费看的黄色欧美网站| 日本成年人网址| 久久一区国产| 99re精彩视频| 国产麻豆午夜三级精品| 久久久久国产免费| 99精品热视频| xxx在线播放| 国产精品免费视频一区| 人妻互换一区二区激情偷拍| 中文字幕中文字幕在线一区| 成年人看的免费视频| √…a在线天堂一区| 欧美三级 欧美一级| 亚洲国产一区二区在线播放| 一区二区三区视频免费看| 色婷婷综合视频在线观看| 中文字幕乱码在线观看| 在线电影院国产精品| 亚洲全黄一级网站| www.中文字幕| 日韩成人在线视频| 国产二区视频在线观看| www.日韩不卡电影av| 麻豆蜜桃在线| 日本精品视频在线观看| 自拍偷拍欧美日韩| 国产精品二区三区| 亚洲免费成人av在线| 一区二区三区在线观看www| 欧美日一区二区三区在线观看国产免| 日韩中文字幕在线视频观看| 日韩国产在线一| 亚洲精品乱码久久久久久9色| av电影天堂一区二区在线 | 91在线视频国产| 欧美岛国在线观看| 免费国产在线观看| 粗暴蹂躏中文一区二区三区| 性欧美又大又长又硬| 国产主播喷水一区二区| 青青草久久爱| 麻豆md0077饥渴少妇| 亚洲欧美日韩一区在线观看| 视频在线观看免费高清| av亚洲精华国产精华精华| 山东少妇露脸刺激对白在线| 亚洲在线中文字幕| 中文字幕二区三区| 亚洲精品国产电影| 国产精品实拍| 国产suv精品一区二区| 亚洲1区在线| 亚洲精品永久www嫩草| 一本久久综合| 日本wwww色| 国产精品免费视频观看| 日韩av大片在线观看| 91精品国产综合久久香蕉的特点| 欧美视频综合| 久久久噜久噜久久综合| 91麻豆精品国产91久久久更新资源速度超快| 国产精品久久久久久久小唯西川| 成人综合久久| 无码人妻h动漫| 成人丝袜高跟foot| 欧美一区二区三区爽爽爽| 欧美在线视频全部完| 亚洲色大成网站www| 色综合色综合网色综合 | 超碰在线观看97| 久久大综合网| 18岁视频在线观看| 91亚洲精品久久久蜜桃| 免费一级片视频| 欧美精品乱码久久久久久按摩| 免费播放片a高清在线观看| 国a精品视频大全| 日本精品国产| 日韩中文在线字幕| 免费成人你懂的| 人妻av无码一区二区三区| 欧美日韩在线免费观看| 手机在线不卡av| 久久久亚洲影院| 亚洲国产一区二区三区网站| 99精品视频网站| 久久99热这里只有精品| 国产三级在线观看完整版| 欧美亚洲国产怡红院影院| 免费在线观看一级毛片| 欧美诱惑福利视频| 欧亚精品一区| 激情五月开心婷婷| 久久午夜电影网| 日本免费在线观看视频| 亚洲色图综合网| 日韩制服诱惑| 亚洲视频小说| 精品一区二区三区免费播放 | 天堂网在线观看国产精品| 色www免费视频| 国产精品沙发午睡系列990531| 国产在线一级片| 日韩中文字幕久久| 69堂精品视频在线播放| 正在播放91九色| 国产精品 日产精品 欧美精品| 欧美日韩精品亚洲精品| 精品免费国产一区二区三区四区| 国产精品一区hongkong| 国产专区一区二区| 亚洲欧美日本国产专区一区| 一道本在线观看| 欧美三级欧美一级| 欧美a免费在线| 国产福利一区二区三区在线观看| 亚洲精品字幕| 91l九色lporny| 欧美精品一级二级三级| 欧美人与性动交α欧美精品济南到| 国产精品久久九九| 日韩高清欧美激情| 天天综合天天做| 国产丝袜一区二区三区免费视频| 成人一级视频| 91午夜在线观看| 国产女人水真多18毛片18精品视频| 亚洲天堂自拍偷拍| 欧美国产日韩xxxxx| 国产不卡一二三区| 午夜免费视频网站| 欧美视频免费在线观看| 日韩美女网站| 国产一区二区高清不卡| 蜜臀av性久久久久蜜臀aⅴ | 欧美性生交xxxxxdddd| 成人亚洲综合天堂| 国产精品乱码一区二区三区| 视频一区二区中文字幕| 免费一级肉体全黄毛片| 亚洲欧美福利视频| 亚洲高清在线一区| 成人在线看视频| 一区二区三区不卡视频| 你懂的视频在线| 国产精品12| 久久国产尿小便嘘嘘| 国产精品久久久免费视频|