青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

逛奔的蝸牛

我不聰明,但我會(huì)很努力

   ::  :: 新隨筆 ::  ::  :: 管理 ::
在你繼續(xù)深入學(xué)習(xí)之前,請(qǐng)停下腳步弄清這些問題。如果你是新手,這個(gè)教程不要希望一次能看的非常透徹,學(xué)一定階段反回來再看看又會(huì)有新的體會(huì)的。

1. c,c++ background

很多人問 “沒有任何語言基礎(chǔ),我不想學(xué)c直接學(xué)objective-c”
這里簡(jiǎn)單幾句,objc 90%代碼是c、眾多開源代碼是c,c++。你不學(xué)好c在unix世界里只能是個(gè)二流開發(fā)者!也許說得過于嚴(yán)厲,不過自己斟酌把。 


2. Runtime(運(yùn)行時(shí))

Objective-c是動(dòng)態(tài)語言,  很多新手或者開發(fā)人員常常被Runtime這個(gè)東西所迷惑。而恰恰這是一個(gè)非常重要的概念。 為什么重要呢!?我可以這么問:“如果讓你(設(shè)計(jì)、)實(shí)現(xiàn)一個(gè)計(jì)算機(jī)語言,你要如何下手?” 很少程序員這么思考過。但是這么一問,就會(huì)強(qiáng)迫你從更高層次思考(1)以前的問題了。 注意我這句話‘設(shè)計(jì)’括起來了,稍微次要點(diǎn),關(guān)鍵是實(shí)現(xiàn)。

我把實(shí)現(xiàn)分成3鐘不同的層次:
    1. 傳統(tǒng)的面向過程的語言開發(fā),例如c語言。實(shí)現(xiàn)c語言編譯器很簡(jiǎn)單,只要按照語法規(guī)則實(shí)現(xiàn)一個(gè)LALR語法分析器就可以了,編譯器優(yōu)化是非常難的topic,不在這里討論范圍內(nèi),忽略。 這里我們實(shí)現(xiàn)了編譯器其中最最基礎(chǔ)和原始的目標(biāo)之一就是把一份代碼里的函數(shù)名稱,轉(zhuǎn)化成一個(gè)相對(duì)內(nèi)存地址,把調(diào)用這個(gè)函數(shù)的語句轉(zhuǎn)換成一個(gè)jmp跳轉(zhuǎn)指令。在程序開始運(yùn)行時(shí)候,調(diào)用語句可以正確跳轉(zhuǎn)到對(duì)應(yīng)的函數(shù)地址。 這樣很好,也很直白,但是。。。太死板了。everything is per-determined

    2. 我們希望靈活,于是需要開發(fā)面向?qū)ο蟮恼Z言,例如c++。 c++在c的基礎(chǔ)上增加了類的部分。但這到底意味著什么呢?我們?cè)賹懰木幾g器要如何考慮呢?其實(shí),就是讓編譯器多繞個(gè)彎,在嚴(yán)格的c編譯器上增加一層類處理的機(jī)制,把一個(gè)函數(shù)限制在它處在的class環(huán)境里,每次請(qǐng)求一個(gè)函數(shù)調(diào)用,先找到它的對(duì)象, 其類型,返回值,參數(shù)等等,確定了這些后再jmp跳轉(zhuǎn)到需要的函數(shù)。這樣很多程序增加了靈活性同樣一個(gè)函數(shù)調(diào)用會(huì)根據(jù)請(qǐng)求參數(shù)和類的環(huán)境返回完全不同的結(jié)果。增加類機(jī)制后,就模擬了現(xiàn)實(shí)世界的抽象模式,不同的對(duì)象有不同的屬性和方法。同樣的方法,不同的類有不同的行為! 這里大家就可以看到作為一個(gè)編譯器開發(fā)者都做了哪些進(jìn)一步的思考。但是。。。還是死板, 我們?nèi)匀唤衏++是static language。 

    3. 希望更加靈活! 于是我們完全把上面哪個(gè)類的實(shí)現(xiàn)部分抽象出來,做成一套完整運(yùn)行階段的檢測(cè)環(huán)境。這次再寫編譯器甚至保留部分代碼里的sytax名稱,名稱錯(cuò)誤檢測(cè),runtime環(huán)境注冊(cè)所以全局的類,函數(shù),變量等等信息等等,我們可以無限的為這個(gè)層增加必要的功能。調(diào)用函數(shù)時(shí)候,會(huì)先從這個(gè)運(yùn)行時(shí)環(huán)境里檢測(cè)所以可能的參數(shù)再做jmp跳轉(zhuǎn)。這,就是runtime。編譯器開發(fā)起來比上面更加彎彎繞。但是這個(gè)層極大增加了程序的靈活性。  例如當(dāng)調(diào)用一個(gè)函數(shù)時(shí)候,前2種語言,很有可能一個(gè)jmp到了一個(gè)非法地址導(dǎo)致程序crash, 但是在這個(gè)層次里面,runtime就過濾掉了這些可能性。 這就是為什么dynamic langauge更加強(qiáng)壯。 因?yàn)榫幾g器和runtime環(huán)境開發(fā)人員已經(jīng)幫你處理了這些問題。



好了上面說著這么多,我們?cè)俜祷貋砜磑bjective-c.  現(xiàn)在你是不是能理解這樣的語句了呢?

復(fù)制代碼
  1. id obj=self;
  2. if ([obj respondsToSelector:@selector(function1:)) {
  3. }
  4. if ([obj isKindOfClass:[NSArray class]] ) {
  5. }
  6.         
  7. if ([obj conformsToProtocol:@protocol(myProtocol)]) {
  8. }
  9.         
  10. if ([[obj class] isSubclassOfClass:[NSArray class]]) {
  11. }
  12. [obj someNonExistFunction];


看似很簡(jiǎn)單的語句,但是為了讓語言實(shí)現(xiàn)這個(gè)能力,語言開發(fā)者要付出很多努力實(shí)現(xiàn)runtime環(huán)境。這里運(yùn)行時(shí)環(huán)境處理了弱類型、函數(shù)存在檢查工作。runtime會(huì)檢測(cè)注冊(cè)列表里是否存在對(duì)應(yīng)的函數(shù),類型是否正確,最后確定下來正確的函數(shù)地址,再進(jìn)行保存寄存器狀態(tài),壓棧,函數(shù)調(diào)用等等實(shí)際的操作。

復(fù)制代碼
  1. id knife=[Knife grateKnife];
  2. NSArray *monsterList=[NSArray array];
  3. [monsterList makeObjectsPerformSelector:@selector(killMonster:) withObject:knife];


在c,c++年代去完成這個(gè)功能是非常麻煩的,但是動(dòng)態(tài)語言卻非常簡(jiǎn)單。

關(guān)于執(zhí)行效率問題。 “靜態(tài)語言執(zhí)行效率要比動(dòng)態(tài)語言高”,這句沒錯(cuò)。因?yàn)橐徊糠謈pu計(jì)算損耗在了runtime過程中。而靜態(tài)語言生成的機(jī)器指令更簡(jiǎn)潔。正因?yàn)橹肋@個(gè)原因,所以開發(fā)語言的人付出很大一部分努力為了保持runtime小巧上。所以objecitve-c是c的超集+一個(gè)小巧的runtime環(huán)境。  但是,換句話說,從算法角度考慮,這點(diǎn)復(fù)雜度不算差別的,Big O notation結(jié)果不會(huì)有差別。( It's not log(n) vs n^2 )

簡(jiǎn)單理解:“Runtime is everything between your each function call.”  

Runtime好比objective-c的靈魂。很多東西都是在這個(gè)基礎(chǔ)上出現(xiàn)的。所以它是指的你花功夫去理解的。

3. thread

"thread synchronization another notorious trouble!" 

記不記得上學(xué)時(shí)候?qū)W得操作系統(tǒng)這門課,里面都會(huì)有專門一章介紹任務(wù)調(diào)度和生產(chǎn)者消費(fèi)者的問題。 這就是為了今后使用進(jìn)程、線程開發(fā)打基礎(chǔ)。概念很簡(jiǎn)單,但是心知肚明的人很少。難點(diǎn)在synchronization(同步),因?yàn)?. There is no 100% deadlock detection algorithm. If there is, no deadlock at all. 2. 往往這類錯(cuò)誤很隱晦,靜態(tài)分析很難找到。 3. 抽象度較高需要經(jīng)驗(yàn)去把握。  

總體來說,我見到的在這方面的問題可以分為一下幾點(diǎn):
    1. 不知道多線程開發(fā)的幾個(gè)基點(diǎn),看別人代碼越看越糊涂的。一會(huì)NSThread、一會(huì)*****、block等等。。。Apple封裝了很多線程的api, down to core多線程的結(jié)構(gòu)基本是

 
可以看到在多線程開發(fā)中你可以選擇這幾種不同的方式。Mach是最和心的操作系統(tǒng)部分,你可以用但是沒必要,太累。
pthread靈活、輕巧,但是需要理論基礎(chǔ)還是開發(fā)復(fù)雜,最主要的POSIX開的線程不能使用cocoa根據(jù)apple文檔只在pthread下使用cocoa需要先detach at least one NSThread object. 這樣確定[NSThread isMultiThreaded]才可以使用。
NSThread是Mac OS 10.0后發(fā)布的多線程API較為高層,但是缺乏靈活性。
Grand Central Dispatch 10.6引入的開源多線程庫, *****介于pthread和NSThread之間。比NSThread更靈活,小巧但有不需要像pthread一樣考慮很多l(xiāng)ock的問題。而objective-c 2.0發(fā)布的新語法特性之一blocks也正是根據(jù)這種多線程需求推出的。

在你寫多線程代碼或者閱讀多線程代碼時(shí)候,心理先明確了這是那種。

    2. thread和runloop造成的問題
其實(shí)thread和runloop放在以前開發(fā)者根本不太當(dāng)成一個(gè)問題。因?yàn)闆]有runtime能力,runloop就是固定的線程執(zhí)行l(wèi)oop。而現(xiàn)在cocoa開發(fā)新手搞不明白的太多了。 NSRunloop和NSThread啥關(guān)系?由于這個(gè)問題比較多,我單獨(dú)列到第4點(diǎn)里講解把。

    3. thread和Reference Counting內(nèi)存管理造成的問題。
    
引用
線程里面的方法都要放到NSAutoreleasePool里面嗎

這類問題很常見,主要原因是 NSAutoreleasePool 到底是干什么用得不明白。 NSAutoreleasePool跟thread其實(shí)關(guān)系并不顯著,它提供一個(gè)臨時(shí)內(nèi)存管理空間,好比一個(gè)沙箱,確保不會(huì)有不當(dāng)?shù)膬?nèi)存分配泄露出來,在這個(gè)空間內(nèi)新分配的對(duì)象要向這個(gè)pool做一下注冊(cè)告訴:“pool,我新分配一塊空間了”。當(dāng)pool drain掉或者release,它里面分配過的內(nèi)存同樣釋放掉。可見和thread沒有很大關(guān)系。但是,我們閱讀代碼的時(shí)候經(jīng)常會(huì)看到,新開線程的函數(shù)內(nèi)總是以NSAutoreleasePool開始結(jié)束。這又是為什么呢!? 因?yàn)閠hread內(nèi)恰好是最適合需要它的地方! 線程函數(shù)應(yīng)該計(jì)算量大,時(shí)間長(supposed to be heavy)。在線程里面可能會(huì)有大量對(duì)象生成,這時(shí)使用autoreleasepool管理更簡(jiǎn)潔。所以這里的答案是,不一定非要在線程里放NSAutoreleasePool,相對(duì)的在cocoa環(huán)境下任意地方都可以使用NSAutoreleasePool。如果你在線程內(nèi)不使用NSAutoreleasePool,要記得在內(nèi)部alloc和relase配對(duì)出現(xiàn)保證沒有內(nèi)存泄露。 

這里還有一個(gè)值得提出的是autorelease.  NSObject為何會(huì)有autorelease這個(gè)方法? 它是根據(jù)什么auto的? 


    4. mainthread和secondary thread疑惑
    
引用
NSThread的detachNewThreadSelector和self的performSelectorOnMainThread方法有什么不同

    
    5. Asynchronous(異步) vs. Synchronous(同步)
    
引用
我在一個(gè)view要顯示多張web圖片,我想問一下,我是應(yīng)該采用異步一個(gè)一個(gè)下載的方式,還是應(yīng)該采用多線程同時(shí)下載的方式,還是2個(gè)都用,那種方式好呢?

    大家可以看一下這個(gè)問題。這句有一點(diǎn)在我看來是非常奇怪的,因?yàn)槲矣X得問問題的人并不理解同步異步是什么意思。"一個(gè)一個(gè)下載的方式"是同步的行為,“多線程同時(shí)下載”是異步的行為。 都搞混了把!
    
    


4. runloop
現(xiàn)在說說runloop為何會(huì)成為cocoa開發(fā)中迷惑的點(diǎn)。因?yàn)楹芏嘈率譀]有從動(dòng)態(tài)角度看它。 首先回想一下第2點(diǎn)介紹的runtime的概念。 接著我出一個(gè)題思考一下。

現(xiàn)在我有一個(gè)程序片段如下:
復(fù)制代碼
  1. - (void)myThread:(id)sender
  2. {
  3.     NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
  4.     while (TRUE) {
  5.         
  6.         //do some jobs
  7.        //break in some condition
  8.         
  9.         usleep(10000);
  10.         
  11.         [pool drain];
  12.     }
  13.     
  14.     [pool release];
  15. }

現(xiàn)在要求,做某些設(shè)計(jì),使得當(dāng)這個(gè)線程運(yùn)行的同時(shí),還可以從其它線程里往它里面隨意增加或去掉不同的計(jì)算任務(wù)。 這,就是NSRunloop的最原始的開發(fā)初衷。讓一個(gè)線程的計(jì)算任務(wù)更加靈活。 這個(gè)功能在c, c++里也許可以做到但是非常難,最主要的是因?yàn)檎Z言能力的限制,以前的程序員很少這么去思考。

好,現(xiàn)在我們對(duì)上面代碼做一個(gè)非常簡(jiǎn)單的進(jìn)化:

復(fù)制代碼
  1. NSMutableArray *targetQueue;
  2. NSMutableArray *actionQueue;
  3. - (void)myThread:(id)sender
  4. {
  5.     NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];
  6.     while (TRUE) {
  7.         
  8.         //do some jobs
  9.         //break in some condition
  10.         int n=[targetQueue count];
  11.         assert(n==[actionQueue count]);
  12.         for(int i=0;i<n;i++){
  13.             id target=[targetQueue objectAtIndex:i];
  14.             SEL action=NSSelectorFromString([actionQueue objectAtIndex:i]);
  15.             if ([target respondsToSelector:action]) {
  16.                 [target performSelector:action withObject:nil];
  17.             }
  18.         }
  19.                 
  20.         usleep(10000);
  21.         
  22.         [pool drain];
  23.     }
  24.     
  25.     [pool release];
  26. }

注意,這里沒有做線程安全處理,記住Mutable container is not thread safe.
這個(gè)簡(jiǎn)單的擴(kuò)展,讓我們看到了如何利用runtime能力讓線程靈活起來。當(dāng)我們從另外線程向targetQueue和actionQueue同時(shí)加入對(duì)象和方法時(shí)候,這個(gè)線程函數(shù)就有了執(zhí)行一個(gè)額外代碼的能力。

但,有人會(huì)問,哪里有runloop? 那個(gè)是 nsrunloop? 看不出來啊。
復(fù)制代碼
  1. while (TRUE) {
  2. //break in some condition
  3. }

一個(gè)線程內(nèi)這個(gè)結(jié)構(gòu)就叫線程的runloop,   它和NSRunloop這個(gè)類雖然名字很像,但完全不是一個(gè)東西。以前在使用靜態(tài)語言開始時(shí)候,程序員沒有什么迷惑,因?yàn)闆]有NSRunloop這個(gè)東西。 我接著來說,這個(gè)NSRunloop是如何來得。

第二段擴(kuò)展代碼里面確實(shí)沒有NSRunloop這個(gè)玩意兒,我們接著做第3次改進(jìn)。 這次我們的目前是把哪個(gè)動(dòng)態(tài)部分抽象出來。



5. delegate, protocol
這個(gè)會(huì)列出來因?yàn)椋腋杏X問它的數(shù)量?jī)H此于內(nèi)存管理部分,它們用得很頻繁,并且它們是多鐘設(shè)計(jì)模式的重要組成部分。


6. responder chain


7. Memory Reference Counting(RC) & Automatic Reference Counting(ARC)
這個(gè)也許是問得最多的問題了吧。所有這些問題往往來源于3個(gè)地方,1、不了解底層機(jī)制;2、沒有吃透規(guī)則; 3、不了解常用container的Reference Counting特性,或著說沒有下功夫去看對(duì)應(yīng)文檔。

1. 底層機(jī)制
大家是否知道從舊時(shí)代的RC到ARC機(jī)制到底意味著什么呢? 為什么ARC從開發(fā)速度,到執(zhí)行速度和穩(wěn)定性都要優(yōu)于rc?

開發(fā)速度不言而喻,你少寫很多release代碼,甚至很少去操心這部分。

執(zhí)行速度呢?這個(gè)還要從runtime說起,還記得我在第2點(diǎn)說得一句話么:“Runtime is everything between your each function call.”  

RC是一個(gè)古老的內(nèi)存管理哲學(xué),誰分配誰釋放。通過counting來計(jì)數(shù)到底該資源有幾個(gè)使用者。道理很簡(jiǎn)單,但是往往簡(jiǎn)單的東西人卻會(huì)犯錯(cuò)。從來沒有一個(gè)程序員可以充滿信心的說,我寫得代碼從來沒有過內(nèi)存泄露。這樣來看,我們就更需要讓程序可以自己處理這個(gè)管理機(jī)制,這就需要把這個(gè)機(jī)制放到runtime里。

所以RC->ARC就是把內(nèi)存管理部分從普通開發(fā)者的函數(shù)中移到了函數(shù)外的runtime中。因?yàn)閞untime的開發(fā)原型簡(jiǎn)單,邏輯層次更高,所以做這個(gè)開發(fā)和管理出錯(cuò)的概率更小。實(shí)際上編譯器開發(fā)人員對(duì)這部分經(jīng)過無數(shù)次測(cè)試,所以可以說用arc幾乎不會(huì)出錯(cuò)。另外由于編譯的額外優(yōu)化,使得這個(gè)部分比程序員自己寫得代碼要快速很多。而且對(duì)于一些通用的開發(fā)模式,例如autorelease對(duì)象,arc有更優(yōu)秀的算法保證autoreleasepool里的對(duì)象更少。

2. RC規(guī)則
首先說一下rc是什么,r-Reference參照,引用 c-counting計(jì)數(shù), rc就是引用計(jì)數(shù)。俗話說就是記錄使用者的數(shù)量。 例如現(xiàn)在我有一個(gè)房間空著,大家可以進(jìn)去隨意使用,但是你進(jìn)門前,需要給門口的計(jì)數(shù)牌子+1, 出門時(shí)候-1。 這時(shí)候這個(gè)門口的牌子就是該房間里的人數(shù)。一但這個(gè)牌子變?yōu)椋拔揖涂梢园逊块g關(guān)閉。

這個(gè)規(guī)則可以讓NSObject決定是不是要釋放內(nèi)存。當(dāng)一個(gè)對(duì)象alloc時(shí)候,系統(tǒng)分配其一塊內(nèi)存并且object自動(dòng)計(jì)數(shù)retainCount=1 這時(shí)候每當(dāng)[object retain]一次retainCount+1(這里雖然簡(jiǎn)寫也是rc不過是巧合或者當(dāng)時(shí)開發(fā)人員故意選的retain這個(gè)詞吧)每次[object release]時(shí)候retainCount-1 當(dāng)retainCount==0時(shí)候object就真正把這快內(nèi)存還給系統(tǒng)。

3. 常用container的Reference Counting特性
這個(gè)規(guī)則很簡(jiǎn)單把。但是這塊確實(shí)讓新手最頭疼的地方。 問題出在,新手總想去驗(yàn)證rc規(guī)則,又總是發(fā)現(xiàn)和自己的期望不符合。  
無數(shù)次看到有人寫下如下句子
復(fù)制代碼
  1. NSLog(@"%d",[object retainCount]);


復(fù)制代碼
  1. while([object retainCount]>0){
  2.       [object release];
  3. }


當(dāng)然了,我也做過類似的動(dòng)作,那種希望一切盡在掌握中的心態(tài)。但是你會(huì)看到其他人告訴這么做完全沒有意義。rc does not work this way.   也許這樣的暴力釋放會(huì)起作用,但是retainCount并不是用來做這個(gè)的。每個(gè)數(shù)字意味著有其它對(duì)象引用該資源,這樣的暴力釋放很容易導(dǎo)致程序崩潰。這個(gè)數(shù)字也許并不是你心目中的哪個(gè)。因?yàn)槟愫茈y跟蹤到底哪些對(duì)象引用的該資源。你用代碼建立的資源不光只有你的代碼才會(huì)用到,你調(diào)用的各種Framework,F(xiàn)ramework調(diào)用的Framework,都有可能改變這個(gè)資源的retainCount.  所以去驗(yàn)證rc規(guī)則不是明智之舉。

你能做的就是理解規(guī)則,使用規(guī)則,讀文檔了解container的引用特性。或者干脆移到arc上面,讓runtime環(huán)境處理這些問題。

最后說一下不用arc的情況。目前情況來看,有不少第三方的庫并未支持arc,所以如果你的舊項(xiàng)目使用了這些庫,請(qǐng)檢查是否作者發(fā)布了新版本,或者你需要自己修正支持arc。

8. class heritage 


9. English


10. Just trying to be smart

其實(shí)剩下這個(gè)有好幾點(diǎn)要說,但綜合一下把。思路有些相似
例如剛看到這個(gè)問題:
引用
現(xiàn)在有A *a;A*b
[NSMutableArray addObject : a];
[NSMutableArray replaceObjectAtIndex:0 withObject:b]
執(zhí)行完這兩個(gè)之后,拿可變數(shù)組里面的0 的位置 就是b元素了,那這個(gè)時(shí)候a到哪里去了??是否還占用著內(nèi)存,如果占用內(nèi)存的話,又如何去釋放??

It's kind of silly.  我并不是想諷刺問問題的朋友。其實(shí)如果你真的了解了上面這些知識(shí)點(diǎn),就不會(huì)再問這種問題的。 為什么不多思考一層呢,在問這個(gè)問題之前想想,到底為什么會(huì)問出這個(gè)問題? ”如果讓你給NSMutableArray實(shí)現(xiàn)一個(gè)replaceObjectAtIndex函數(shù)你會(huì)怎么寫?“  難道連個(gè)[obj release]都考慮不到么?然后根據(jù)ARC,它到底釋放了沒不言自明了把。

其實(shí)這種問題論壇里很多的。不妨在迷惑的時(shí)候,先問問自己為什么會(huì)迷惑。


(1)這里其實(shí)很有意思,為何我用“更高層次思考”,而不是“更底層次。作為一個(gè)編譯器和語言開發(fā)人員,面對(duì)的問題確實(shí)更底層沒錯(cuò),但是他們思考的維度更高,更抽象,這樣子。一個(gè)不算恰當(dāng)?shù)谋确骄秃孟褚粋€(gè)三維世界的人處理二維世界的一條線的問題。 
@import url(http://m.shnenglu.com/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);

From: http://www.cocoachina.com/bbs/read.php?tid=74564
posted on 2011-12-07 15:07 逛奔的蝸牛 閱讀(929) 評(píng)論(0)  編輯 收藏 引用 所屬分類: Cocoa
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产亚洲精品久久久久婷婷瑜伽| 国产精品亚发布| 欧美成人一品| 一区二区精品国产| 亚洲欧洲av一区二区| 亚洲人成小说网站色在线| 国产日韩欧美| 国产欧美三级| 亚洲福利在线视频| 一本久久知道综合久久| 99国产精品| 99成人在线| 午夜精品久久久久久久男人的天堂 | 久久久久久久97| 欧美一区二区三区在线看| 久久精品盗摄| 欧美日韩不卡视频| 国产私拍一区| 亚洲人成人99网站| 久久成人综合视频| 欧美福利电影在线观看| 亚洲剧情一区二区| 欧美一区观看| 欧美日韩另类综合| 尤物精品国产第一福利三区 | 亚洲精品乱码久久久久久久久| 欧美粗暴jizz性欧美20| 这里只有精品丝袜| 午夜久久久久| 一区二区三区国产精品| 午夜精品一区二区三区在线播放| 久久激情综合| 欧美欧美全黄| 在线观看日韩av| 性欧美大战久久久久久久免费观看 | 欧美视频官网| 国产一区二区三区高清在线观看| 亚洲精品小视频在线观看| 欧美一区二区三区男人的天堂 | 狠狠久久婷婷| 亚洲欧美视频在线观看视频| 欧美福利在线| 久久精品国产亚洲精品| 国产精品r级在线| 亚洲精品日韩精品| 免费成人你懂的| 欧美一级大片在线观看| 国产精品成人一区二区三区夜夜夜| 在线观看精品一区| 欧美中文字幕不卡| 亚洲手机在线| 欧美性理论片在线观看片免费| 亚洲激情啪啪| 欧美激情视频一区二区三区在线播放| 欧美一区二区三区婷婷月色 | 亚洲精品美女久久久久| 久久这里只精品最新地址| 性欧美videos另类喷潮| 国产精品乱码人人做人人爱| 亚洲图片激情小说| 99精品视频免费观看视频| 欧美精品一区三区在线观看| 亚洲欧洲日本mm| 欧美电影免费观看高清| 久久久精品国产一区二区三区 | 国产一区日韩一区| 久久国产日韩| 久久精品国产清高在天天线| 国产综合一区二区| 女女同性精品视频| 欧美成人精品在线观看| 一本色道精品久久一区二区三区| 亚洲精品免费电影| 欧美午夜不卡视频| 性欧美video另类hd性玩具| 午夜在线视频一区二区区别| 国产一区二区久久久| 久久在线观看视频| 美女主播视频一区| 一区二区欧美精品| 亚洲欧美电影院| 黄色成人精品网站| 亚洲国产日韩欧美在线99| 欧美日韩国产天堂| 欧美在线看片| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲国产日韩欧美| 亚洲国产精品久久久久秋霞不卡| 欧美激情一区二区久久久| 欧美日韩国产综合新一区| 欧美一级黄色录像| 久久综合电影| 亚洲综合精品四区| 久久久噜噜噜久噜久久| 日韩亚洲欧美成人一区| 亚洲一区999| 在线播放不卡| 日韩一区二区电影网| 国产一区二区三区奇米久涩| 亚洲国产视频一区| 国产三级欧美三级| 亚洲人成在线影院| 国内精品久久国产| 一区二区三区 在线观看视频| 国内一区二区在线视频观看| 亚洲欧洲综合另类在线| 国产一区二区欧美日韩| 日韩视频国产视频| 亚洲国产精品成人综合| 午夜激情综合网| 亚洲小说欧美另类婷婷| 暖暖成人免费视频| 久久久久久9| 欧美午夜视频| 亚洲国产一区在线| 红桃视频国产一区| 欧美一级免费视频| 亚洲专区在线视频| 欧美精品一区二区三区在线看午夜| 久久五月天婷婷| 国产日本欧美一区二区三区在线| 亚洲精品中文在线| 亚洲人成在线观看一区二区 | 亚洲欧洲久久| 亚洲国内精品在线| 久久久亚洲高清| 久久久久久精| 国内成人精品2018免费看 | 欧美日韩国产色综合一二三四 | 欧美午夜视频| 99视频精品免费观看| 亚洲精品视频在线观看网站| 久久久噜噜噜久久中文字免| 久久综合激情| 影音先锋久久资源网| 欧美一区二区三区四区在线观看地址| 午夜视频在线观看一区二区三区| 一区二区三区成人精品| 亚洲青色在线| 免费观看在线综合| 亚洲高清一二三区| 在线精品在线| 久久综合亚州| 亚洲国产老妈| 一本到高清视频免费精品| 欧美伦理a级免费电影| 一区二区三区视频免费在线观看| 亚洲视频在线二区| 欧美日韩一卡| av不卡在线看| 亚洲精品黄网在线观看| 欧美国产在线电影| 99在线精品观看| 欧美在线观看一二区| 国产精品高清网站| 亚洲综合丁香| 久久婷婷av| 亚洲人成在线观看一区二区 | 黄色另类av| 欧美成人a视频| 亚洲人成网站999久久久综合| 一本色道久久综合精品竹菊 | 欧美激情精品久久久久久大尺度 | 久久亚洲国产精品日日av夜夜| 欧美freesex8一10精品| 一区二区动漫| 国产在线视频欧美| 欧美激情女人20p| 亚洲一区二区三区精品视频| 另类图片国产| 亚洲午夜羞羞片| 国内久久视频| 欧美日韩日本国产亚洲在线| 欧美一区二区三区视频| 亚洲日本欧美| 久久综合九色综合网站| 在线视频亚洲一区| 在线免费不卡视频| 国产精品入口麻豆原神| 麻豆精品在线观看| 亚洲免费在线| 亚洲精品永久免费精品| 久久久噜噜噜久久人人看| 日韩天堂av| 韩国精品久久久999| 欧美日韩喷水| 欧美激情综合五月色丁香小说| 午夜影视日本亚洲欧洲精品| 日韩一级网站| 最新日韩在线| 欧美电影免费| 免费成人在线观看视频| 欧美伊久线香蕉线新在线| 一区二区三区日韩精品视频| 在线看国产日韩| 狠狠色综合一区二区| 国产日韩一区在线| 国产精品美女久久久免费 | 老司机免费视频一区二区| 亚洲欧美国产另类|