日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

objective-c java_程序员转型指南 当Java遇见了Objective-C

發布時間:2025/3/19 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 objective-c java_程序员转型指南 当Java遇见了Objective-C 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【51CTO譯文】目前在移動開發領域最重要的兩個平臺分別為Android平臺和iOS,在兩個平臺開發應用分別要用Java和Objective-C語言。雖然Java和Objective-C就像是處在兩個不同的世界,但這兩種編程語言以及它們的平臺庫等等還是有許多相似的地方。本文為51CTO獨家譯文,講述了外國開發者Genadiy Shteyman從Java開發轉向Objective-C需要掌握技能。

以下為全部譯文,(文章中的“我”指代"Genadiy Shteyman"):

最近一段時間,我從編寫企業Java應用轉向使用Objective-C。經過長時間的困擾之后,我發現兩者的相似之處很多,如果能夠早些讀到相關的文章,轉換工作會容易得多。

所以我寫下這篇文章,想要幫助Java程序員快速的掌握Objective-C開發的主要特點。我使用一個社交網絡應用作為例子,演示怎樣用這兩種語言建立開發環境。例子中會包括創建基本對象與比較兩種語言的MVC設計模式,還會演示兩種語言中數據的存儲和獲取。

Objective-C開發:從哪里開始

開發iPhone應用,首先最好要使用Mac電腦。最新的Mac OS X 10.6版本通常包含了一份Xcode IDE,以及使用Objective-C的配套iPhone開發軟件工具套裝(圖表一)。

圖表一:Xcode IDE開發環境,項目視圖

2010年11月,蘋果發布了期待已久的iOS SDK 4.2,其中包含了豐富的框架和功能,用來搭建互動iPhone應用。Xcode還包含了一個仿真器,可以讓你在電腦中模擬程序運行在手機上的效果。

Objective-C是iPhone應用的主要開發語言。對Java開發者來說,幸運的是Objective-C是完全面向對象的,使用和其他OO語言相同的理念——繼承、多態和封裝等等。定義一個類(Objective-C中稱為module或.m文件),首先要定義一個接口(一個header或.h文件),然后把它引入到類中。

我們來看這個社交網絡應用的例子,這個應用需要建立一個聯系冊,讓你和朋友們時常保持聯系。朋友的檔案存儲在FriendProfile對象中,包含四個字段:朋友的名字、城市、國家和電話號碼,如Listing One所示:

Listing?One

//??FriendProfile.h

#import?

#import?

@interface?FriendProfile?:?NSObject?{

}

@property?(nonatomic,?retain)?NSString?*?name;

@property?(nonatomic,?retain)?NSString?*?country;

@property?(nonatomic,?retain)?NSString?*?city;

@property?(nonatomic,?retain)?NSString?*?phoneNbr;

@end

//FriendProfile.m

#import?"FriendProfile.h"

@implementation?FriendProfile

@synthesize?name;

@synthesize?country;

@synthesize?city;

@synthesize?phoneNbr;

@end

在這個例子中,接口FriendProfile:NSObject表示我們定義了一個叫做FriendProfile的接口,它從NSObject基類中繼承各種功能。NSObject是Objective-C的根類,大多數Objective-C中用到的類都會從中繼承,這和Java中的Object類相似。接下來,我們分配多個NSString類型變量(等同于Java中的String類型)用來存儲朋友的數據。然后是建立FriendProfile類,使用@synthesize關鍵字自動創建各種get和set方法。建立一個FriendProfile對象可以使用如下的語句:

FriendProfile?*?profile?=?[[FriendProfile?alloc]?init];

這里的alloc和init就像Java里的new關鍵字,用來在內存中建立FriendProfile對象。接下來,就可以給對象的各種字段賦值了。

[profile?setName:@"Albert"];

[profile?setCountry:@"USA"];

[profile?setCity:@"Houston"];

[profile?setPhoneNbr:@"123-456-789"];

或者可以更簡單一點:

profile.name?=?@"Albert";

profile.country?=?@"USA";

profile.city?=?@"Houston;

profile.phoneNbr?=?@"123-456-789";

想要充分了解Objective-C的語法和功能可以去蘋果的開發者站點,那里的語言參考編寫的非常好。

Java的構造

在Java中,如果我們想寫一個FriendProfile類,所做的和Objective-C會非常相像,就像Listing Two所示:

Listing?Two

packagecom.vo;

publicclassFriendProfile?{

privateString?name;

privateString?country;

privateString?city;

privateString?phoneNbr;

publicString?getName()?{

returnname;

}

publicvoidsetName(String?name)?{

this.name?=?name;

}

publicString?getCountry()?{

returncountry;

}

publicvoidsetCountry(String?country)?{

this.country?=?country;

}

publicString?getCity()?{

returncity;

}

publicvoidsetCity(String?city)?{

this.city?=?city;

}

publicString?getPhoneNbr()?{

returnphoneNbr;

}

publicvoidsetPhoneNbr(String?phoneNbr)?{

this.phoneNbr?=?phoneNbr;

}

}

Listing Two中提供了相似的字段,但是那些get和set必須清楚的寫出來。現在我們看看怎樣在通訊錄里添加一個新朋友,參加Listing Three:

Listing?Three

publicclassFriendlyServletControllerextendsHttpServlet?{

privatestaticfinallongserialVersionUID?=?1L;

/**

*?@see?HttpServlet#doGet(HttpServletRequest?request,

*?HttpServletResponse?response)

*/

protectedvoiddoGet(HttpServletRequest?request,

HttpServletResponse?response)

throwsServletException,?IOException?{

doPost(request,?response);

}

/**

*?@see?HttpServlet#doPost(HttpServletRequest?request,

*?HttpServletResponse?response)

*/

protectedvoiddoPost(HttpServletRequest?request,

HttpServletResponse?response)

throwsServletException,?IOException?{

response.setContentType("text/html");

PrintWriter?out?=?response.getWriter();

finalString?action?=

request.getParameter("requestedAction");

if(action==null||?action.trim().length()==0){

out.println("invalid?action?requested");

return;

}

else

if(action.equalsIgnoreCase("addToContacts")){

String?name?=?request.getParameter("name");

String?country?=?request.getParameter("country");

String?city?=?request.getParameter("city");

String?phoneNbr?=?request.getParameter("phoneNbr");

//normally?you?have?to?validate?browser-originated?requests

booleanvalidParameters?=

validateParameters(name,?country,?city,?phoneNbr);

if(validParameters==false){

out.println(

"please?verify?and?submit?correct?information");

return;

}

FriendProfile?newProfile?=newFriendProfile();

newProfile.setName(name);

newProfile.setCountry(country);

newProfile.setCity(city);

newProfile.setPhoneNbr(phoneNbr);

ProfileManager.getInstance().addToContacts(newProfile);

out.println("Your?friend?is?added?to?contacts");

return;

}

else{

out.println("invalid?action?requested");

return;

}

}

}

在這個例子里,FriendlyServletController類從HTTPServlet中獲取行為,HTTPServlet是Java的客戶端組件類,負責處理瀏覽器的請求。當用戶登入網站并且決定添加一個朋友時,他會在HTML表單的字段中填入數據,表單提交時,Servlet收到并驗證請求的參數,并創建一個FriendProfile對象,在內存中存儲數據。而ProfileManager類會把你的FriendProfile對象存儲到數據庫中。

Objective-C的MVC模式

在Java Web應用中常采用Model-View-Controller(MVC)設計模式,iPhone開發中也是如此。如果你在iOS Reference Library中查找UIViewController類的定義,你會發現這樣的話:“UIViewController類為iPhone應用提供最基本的視圖管理模型……你可以使用UIViewController實例來管理視圖結構。”UIViewController實際上是一個控制器組件,用來觸發業務邏輯,更新客戶端的視圖。

圖表2:Model-View-Controller(MVC)設計模式

如果你想在Xcode中創建一個UIViewController類型的對象,可以選擇通過XIB文件來創建。這種特殊的Xcode文件定義了圖形用戶界面或者說視圖,包含了各種不同的控件,比如按鈕、圖表和標簽等等。

回到我們的例子中來,假設你已經在聯系列表中添加了幾個朋友,現在想按下某個朋友的鏈接來看查看他的詳細信息,這個功能可以通過定義控制器類來完成。代碼請見Listing Four:

Listing?Four

//??FriendProfileViewController.h

#import?

@classFriendProfile;

@classDatabaseController;

@classMFriendProfile;

//?define?our?custom?controller?to?inherit?from

//?the?UIViewController?class

@interface?FriendProfileViewController?:?UIViewController?{

FriendProfile?*?profile;

MFriendProfile?*?mprofile;

DatabaseController?*dbController;

}

@property(nonatomic,?retain)?IBOutlet?UILabel?*lname;

@property(nonatomic,?retain)?IBOutlet?UILabel?*lcountry;

@property(nonatomic,?retain)?IBOutlet?UILabel?*lcity;

@property(nonatomic,?retain)?IBOutlet?UILabel?*lphoneNbr;

-(IBAction)buttonPressed:(id)sender;

@end

#import?"FriendProfileViewController.h"

#import?"FriendProfile.h"

#import?"DatabaseController.h"

#import?"MFriendProfile.h"

@implementation?FriendProfileViewController

...

//?Implement?viewDidLoad?to?do?additional?setup?after

//?loading?the?view,?typically?from?a?nib.

-?(void)viewDidLoad?{

[super?viewDidLoad];

//create?sample?profile

profile?=?[[FriendProfile?alloc]?init];

profile.name?=?@"Albert";

profile.country?=?@"USA";

profile.city?=?@"Houston";

profile.phoneNbr?=?@"123-456-789";

//show?profile?on?a?screen

lname.text?=?profile.name;

lcountry.text?=?profile.country;

lcity.text?=?profile.city;

lphoneNbr.text?=?profile.phoneNbr;

}

//call?the?model?to?bring?friend?information?from?database

-(IBAction)buttonPressed:(id)sender{

NSLog(@"fetching?friend?profile?by?name.");

//?name?is?hardcoded?for?demo?purposes.

//?Usually?entered?by?user.

mprofile?=?(MFriendProfile*)

[dbController?getFriendProfileObjectbyName:@"Albert"];

lname.text?=?mprofile.name;

lcountry.text?=?mprofile.country;

lcity.text?=?mprofile.city;

lphoneNbr.text?=?mprofile.phoneNbr;

}

這段代碼中,我們創建了一個FriendProfileViewController實例,在我們定義的View Bundle中進行初始化,顯示出朋友的各種信息。

Alloc和initWithNibName都是控制器類創建實例時使用的方法,和Java的new關鍵字功能一樣。

模型在裝載視圖時開始啟動。每個控制器都有一些從父類UIViewController繼承而來的生命周期方法。比如ViewdidLoad方法就是其中之一,它負責在視圖裝載之后的額外設置,從數據庫中取出信息,更新視圖。在最簡單的情況下,我們的視圖包含一系列標簽,或者是UILabel類型的對象,可以在應用運行時設置各種文本,用戶可以立即看見朋友信息被更新了。

Java的MVC模式

下面來看看如何使用Java后臺在瀏覽器窗口中顯示出朋友的詳細信息。我們稍微修改一下FriendlyServletController即可,代碼請見Listing Five:

Listing?Five

importjava.io.IOException;

importjava.io.PrintWriter;

importjavax.servlet.ServletException;

importjavax.servlet.http.HttpServlet;

importjavax.servlet.http.HttpServletRequest;

importjavax.servlet.http.HttpServletResponse;

importcom.model.ProfileManager;

importcom.vo.FriendProfile;

/**

*?Servlet?implementation?class?FriendlyServletController

*/

publicclassFriendlyServletControllerextendsHttpServlet?{

privatestaticfinallongserialVersionUID?=?1L;

/**

*?@see?HttpServlet#doGet(HttpServletRequest?request,

*?HttpServletResponse?response)

*/

protectedvoiddoGet(HttpServletRequest?request,

HttpServletResponse?response)

throwsServletException,?IOException?{

doPost(request,?response);

}

/**

*?@see?HttpServlet#doPost(HttpServletRequest?request,

*??????HttpServletResponse?response)

*/

protectedvoiddoPost(HttpServletRequest?request,

HttpServletResponse?response)

throwsServletException,?IOException?{

response.setContentType("text/html");

PrintWriter?out?=?response.getWriter();

finalString?action?=?request.getParameter("requestedAction");

if(action==null||?action.trim().length()==0){

out.println("invalid?action?requested");

return;

}

elseif(action.equalsIgnoreCase("showFriendProfile")){

String?name?=?request.getParameter("name");

FriendProfile?existProfile?=newFriendProfile();

existProfile.setName(name);

existProfile?=

ProfileManager.getInstance().lookupContact(existProfile);

if(existProfile==null){

out.println("profile?was?not?found");

}else{

out.println("here?is?your?contact?information:"+

existProfile.getName()?+"?from?"+

existProfile.getCity()?+"?in?"+

existProfile.getCountry()?+"?at?"+

existProfile.getPhoneNbr());

}

return;

}

elseif(action.equalsIgnoreCase("addToContacts")){

String?name?=?request.getParameter("name");

String?country?=?request.getParameter("country");

String?city?=?request.getParameter("city");

String?phoneNbr?=?request.getParameter("phoneNbr");

//normally?you?have?to?validate?browser-originated?requests

booleanvalidParameters?=

validateParameters(name,?country,?city,?phoneNbr);

if(validParameters==false){

out.println("please?verify?and?submit?correct?information");

return;

}

FriendProfile?newProfile?=newFriendProfile();

newProfile.setName(name);

newProfile.setCountry(country);

newProfile.setCity(city);

newProfile.setPhoneNbr(phoneNbr);

ProfileManager.getInstance().addToContacts(newProfile);

out.println("Your?friend?is?added?to?contacts");

return;

}

else{

out.println("invalid?action?requested");

return;

}

}

//basic?parameter?validation?routine

privatebooleanvalidateParameters(String?name,?String?country,

String?city,?String?phoneNbr){

/basic?validation?to?checkifall?parameters?are?sent

if(name==null||?name.trim().length()==0||

country==null||?country.trim().length()==0||

city?==null||?city.trim().length()==0||

phoneNbr?==null||?phoneNbr.trim().length()==0){

returnfalse;

}

returntrue;

}

}

在這個例子中,FriendlyServletController接收表單產生的HTTP請求,我們特別編寫了一個事件叫做showFriendProfile。這里我們的模型是一個ProfileManager對象,負責通過朋友姓名在數據庫中查找記錄。然后查找到的數據庫記錄會以FriendProfile對象的形式返回到控制器,其中包含了各種詳細信息,組成視圖顯示在瀏覽器窗口中。

Objective-C的數據庫訪問

較復雜的應用都會用到某類數據存儲方式,通常是一個數據庫。蘋果推薦開發者使用稱為Core Data的Cocoa API框架進行數據庫存取操作。Core Data框架能夠直接與SQLite數據庫相結合(我們例子中的數據庫運行在移動設備上)。Core Data隱藏了復雜的SQL操作,取而代之的是非常方便的NSManagedObject界面,你可以直接操作整個對象實例的各種字段,這些字段可以自動存入數據庫。Core Data框架的另一個方便之處是在數據庫中創建表(以及向表中添加關聯與限制),這些都可以在Core Data的用戶界面中完成。

圖表3:Core Data stack結構

現在回到我們的社交網絡應用例子,看看怎么從數據庫中取出朋友的信息。我們使用SQLite 和Core Data API,但首先我們要稍微修改一下FriendProfile類,代碼請見Listing Six:

Listing?Six

//FriendProfile.h?interface?file//?MFriendProfile.h

#import?

#import?

@interface?MFriendProfile?:?NSManagedObject?{

}

@property?(nonatomic,?retain)?NSString?*name;

@property?(nonatomic,?retain)?NSString?*?country;

@property?(nonatomic,?retain)?NSString?*?city;

@property?(nonatomic,?retain)?NSString?*?phoneNbr;

@end

//?MFriendProfile.m

#import"MFriendProfile.h"

@implementation?MFriendProfile

@dynamicname;

@dynamiccountry;

@dynamiccity;

@dynamicphoneNbr;

@end

這里的FriendProfile類與Listing One中的不同之處在于在這里我加入了Core Data框架的頭文件。而且在這里我們的類是從NSManagedObject中擴展出來,帶有了Core Data對象需要的全部基本行為。Core Data的NSManagedObject類中使用到的Accessor則在應用運行時動態創建。如果你想在FriendProfile類中聲明或使用屬性,但不想在編譯時出現缺少方法的警告,可以使用@dynamic指令,而不是@synthesize指令。

使用NSManagedObject API有些復雜,但你理解之后就會變得很好用。Listing Seven是一個示例方法,從數據庫的FRIENDPROFILE表中取得朋友的信息。表包含四列:NAME、COUNTRY、CITY和PHONE-NBR。

Listing?Seven

//?DatabaseController.m

#import"DatabaseController.h"

#import?

#define?kDatabaseName?@"SocialNetworking.sqlite"

...

-?(NSManagedObject?*)getFriendProfileObjectbyName:(NSString?*)name{

managedObjectContext?=?[self?managedObjectContext];

//createsort?descriptorstospecify?preferred?sortorder

NSSortDescriptor?*sortDescriptor?=

[[NSSortDescriptor?alloc]?initWithKey:@"name"ascending:YES];

NSArray?*sortDescriptors?=

[[NSArray?alloc]??initWithObjects:sortDescriptor,nil];

//specifywhereclause

NSPredicate?*predicate?=

[NSPredicate?predicateWithFormat:@"name?==?%d",name];

//fetchour?friendís?profilefromdatabasetable

NSEntityDescription?*entity?=

[NSEntityDescription?entityForName:@"MFRIENDPROFILE"

inManagedObjectContext:managedObjectContext];

NSFetchRequest?*request?=?[[NSFetchRequest?alloc]?init];

[request?setEntity:entity];

//Setthe?predicateforthecurrentview

if?(predicate)

{

[request?setPredicate:predicate];

}

if?(sortDescriptors)

{

[request?setSortDescriptors:sortDescriptors];

}

NSError?*error?=?nil;

NSMutableArray?*results?=?[[managedObjectContext

executeFetchRequest:request?error:&error]?mutableCopy];

if?(error)

{

NSLog(@"error?in?getFriendProfileObjectbyName:%@",

[error?userInfo]);

}

[sortDescriptor?release];

[sortDescriptors?release];

[predicate?release];

if?([resultscount]?>?0)?{

return[results?objectAtIndex:0];

}

returnnil;

}

getFriendProfileObjectbyName方法把朋友的姓名作為一個參數接收過來。通過使用Core Data API,我們可以指定在哪一個表中進行查詢和排序,并且在后臺執行SQL語句。

SQL>select*fromFriendProfilewherename="Albert";

Core Data API有許多種沒有封裝的“半成品”代碼,可以訪問NSManagedObjectContext、NSPersistentStoreCoordinator和NSManaged-ObjectModel對象。你可以復制這些代碼,只要你取得了FriendProfile對象,就能以下面的形式取得它的屬性:

NSString*name=????????FriendProfile.name;

NSString*?country?=?FriendProfile.country;

NSString*?city?=????????FriendProfile.city;

NSString*?phoneNbr?=????FriendProfile.phoneNbr;

總的來說,Core Data是一個非常有用的功能,可以讓你通過圖表來定義數據表和管理,可以動態生成相應的對象,而且無需使用復雜的SQL語句。但不好的方面是這里有大量的沒有經過封裝的代碼,這樣你在使用它們與測試時需要非常小心。

Java:數據庫存取

Java有許多數據庫框架。在我看來,Hibernate是和Core Data API最相像的Java框架。Hibernate使用的是對象關系映射(Object-Relational Mapping,ORM)機制,這樣你可以通過簡單的在對象中設置字段并且直接映射成數據庫中的表來把對象數據放入關系型數據庫中。映射可以通過XML文件,也可以通過Java 5中的metadata annotation方法獲得。Listing Eight是使用XML進行映射的一個例子。

Listing Eight

此例中,Listing Two中的FriendProfile對象被映射到數據庫中的一個同名表,這是一種傳統的數據映射做法。對象的四個字段被直接映射到表中的四列,通過映射,Hibernate可以使用SQL語句來完成各種操作。

另一個配置文件叫做hibernate.cfg.xml,包含了數據庫連接設置的詳細信息,包括數據庫URL、數據庫驅動以及用戶名和密碼等,代碼請見Listing Nine:

Listing?Eight

Listing Nine中我們導入了所有需要的Hibernate庫,創建了一個Hibernate Session并且開始事務,接下來我們僅簡單使用了Session對象的get方法就輕松檢索到了FriendProfile對象,傳遞回所需要的對象類型并過濾出查詢的字段——朋友的姓名。

結論

除去語法結構與運行平臺的不同,使用Objective-C進行iPhone開發與使用Java進行網絡應用開發在下面幾個方面是相同的:

◆兩種語言都是面向對象的

◆兩種語言使用同樣的設計模式,例如MVC

◆兩種語言使用相似的數據庫存儲技術,例如ORM

然而,對于Java開發者,使用Objective-C時在有些地方要格外小心:

◆創建對象:Java對象是在運行時通過new關鍵字創建的。因此Java程序員無需擔心內存分配問題。而在Objective-C中,一個對象可以由三個關鍵字創建,alloc、new或者copy,這三個關鍵字在創建對象時都會增加對象的持有計數(retain count),持有計數是Objective-C特有的內存管理方法,顯示有多少個指針指向對象,是否可以被內存管理器回收。

◆銷毀對象:由于強大的垃圾回收機制,Java的內存管理工作極度簡單。Java的引用對象都存儲在JVM的堆內存中,一旦不再被引用,就可以作為垃圾回收。Objective-C使用的是內存管理器,而不是垃圾回收器。如果你使用上面說的三種方法在內存中創建了一個對象,那么必須使用release方法來釋放對象。release方法會減少持有計數,當計數降到0時,被引用的對象會接受一個來自高級類的dealloc方法,釋放它占用的內存并重新分配。如果忘記了釋放內存或釋放失敗,那么會造成內存泄露和不可預見的錯誤。

◆過多釋放和過早重新分配內存:由于垃圾回收機制,Java程序員可以完全不考慮這些問題。但Objective-C程序員需要小心,不能釋放出比分配的更多的內存。如果在已經重新分配的對象上過多釋放內存,就會造成應用的崩潰。

上面這些例子說明了Objective-C和Java在語法和語言元素上有很多相同之處。更重要的是,它們解決問題的思路和用到的組件也是非常相似的。如果你是Java程序員,相信你在看完這篇文章后,轉向Objective-C的道路會更加通順。

【51CTO譯稿,非經授權謝絕轉載,合作媒體轉載請注明原文出處、作者及51CTO譯者!】

【編輯推薦】

【責任編輯:立方TEL:(010)68476606】

總結

以上是生活随笔為你收集整理的objective-c java_程序员转型指南 当Java遇见了Objective-C的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美性猛交乱大交 | 亚洲av日韩精品久久久久久久 | xx性欧美肥妇精品久久久久久 | 欧美韩日 | 国产剧情一区二区三区 | 国产在线播放av | 成人1区2区3区 | 熟妇人妻无乱码中文字幕真矢织江 | 中文字幕天堂在线 | 麻豆成人在线视频 | 日本一区二区久久 | 亚洲高清色图 | 久久久久久久一区 | 免费在线观看的av | 国产传媒一区二区三区 | 国产白袜脚足j棉袜在线观看 | 加勒比在线一区 | 国产女人18毛片水真多1 | 国产精品成人免费精品自在线观看 | 欧美性在线观看 | 2018国产大陆天天弄 | 中文字幕精品三级久久久 | 美女视频国产 | 麻豆视频网站在线观看 | 免费亚洲婷婷 | 免费看黄色片视频 | 激情六月天 | www.浪潮av.com| 外国一级片 | 18av视频 | 日韩av资源在线观看 | 在线免费观看黄色片 | 超碰一区二区三区 | 免费人成在线观看 | 亚洲乱码国产乱码精品精 | 少妇精品亚洲一区二区成人 | 亚洲av综合色区无码二区爱av | 特级毛片在线观看 | 香蕉视频一级片 | 中文自拍 | 国产自偷自拍 | 黄色成人免费观看 | 神马久久网站 | 少妇自拍视频 | av尤物 | 91av国产在线 | 超污网站在线观看 | 色91在线 | 午夜一级视频 | 日韩av高清在线播放 | 日韩精品电影在线 | 男人阁久久 | 国产一区二区在线精品 | 自偷自拍av | 久久婷五月| 久久av红桃一区二区小说 | 国内自拍真实伦在线观看 | 亚洲春色一区二区三区 | 亚洲人女屁股眼交6 | 麻豆传媒在线观看 | 成人黄色免费视频 | www.国产毛片 | 高潮毛片无遮挡高清免费 | 91禁在线看 | 久久综合综合 | h无码动漫在线观看 | 国产一区二区三区在线播放无 | 在线不卡免费视频 | 久久精品性爱视频 | 精品国产一区二区三区久久久蜜臀 | 男女ss视频| 影音先锋成人资源网 | 欧美黄色录像视频 | 国产精品人人妻人人爽 | 视频一区在线免费观看 | 日韩精品免费电影 | 亚洲精品福利在线观看 | 美女热逼| 久久影视| 天天操天天碰 | 国产一区第一页 | 欧美成人久久久免费播放 | 成人午夜剧场视频网站 | 免费av网站在线观看 | 国产精品呻吟久久 | 自拍一级片 | 喷水视频在线观看 | 日日夜夜操视频 | 啪啪激情网 | 久久久一 | 色婷婷av一区 | 欧美乱妇狂野欧美在线视频 | 男人捅爽女人 | 91精品国产乱码在线观看 | 自拍 偷拍 欧美 | 欧美三日本三级少妇三级99观看视频 | 午夜精品久久久久久99热 | 国产色网站| 视频在线观看视频 |