中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

如何避免iPhone應(yīng)用中內(nèi)存泄露
來(lái)源:易賢網(wǎng) 閱讀:1660 次 日期:2015-01-22 10:08:03
溫馨提示:易賢網(wǎng)小編為您整理了“如何避免iPhone應(yīng)用中內(nèi)存泄露”,方便廣大網(wǎng)友查閱!

創(chuàng)建對(duì)象時(shí),所有權(quán)通過(guò)alloc、new、或者copy的方式建立,之后通過(guò)調(diào)用retain或者通過(guò)Cocoa函數(shù)來(lái)分配和復(fù)制對(duì)象的所有權(quán)。 內(nèi)存釋放有兩種方式,一種方法是明確地請(qǐng)求釋放對(duì)象的所有權(quán),另一種方法則是使用自動(dòng)釋放池(auto-release pool)。

所有權(quán)的背后是一個(gè)和引用有關(guān)的運(yùn)算系統(tǒng),iPhone SDK的大多數(shù)對(duì)象使用這個(gè)系統(tǒng),彼此之間建立著很強(qiáng)的引用和參照。

當(dāng)你創(chuàng)建一個(gè)對(duì)象時(shí),引用值為1,調(diào)用一次retain則對(duì)象的引用值加1,調(diào)用一次release則對(duì)象的引用值減1,當(dāng)引用值為0時(shí),對(duì)象的所有權(quán)分配將被取消。使用自動(dòng)釋放池意味著對(duì)象的所有權(quán)將在一段延后的時(shí)間內(nèi)被自動(dòng)取消。

對(duì)象之間也可以建立弱的引用參照,此時(shí)意味著,引用值不會(huì)被保留,對(duì)象的分配需要手動(dòng)取消。

什么時(shí)候使用retain?

什么時(shí)候你想阻止對(duì)象在使用前就被釋放?

每當(dāng)使用copy、alloc、retain、或者Cocoa函數(shù)來(lái)創(chuàng)建和復(fù)制所有權(quán),你都需要相應(yīng)的release或者auto-release。

開(kāi)發(fā)者應(yīng)該從所有權(quán)的角度來(lái)考慮對(duì)象,而不必?fù)?dān)心引用值。只要你有相應(yīng)的retain和release方法,就能夠?qū)σ弥颠M(jìn)行+1和-1操作。

注意:你或許想使用[object retainCount],但它可能因?yàn)镾DK的底層代碼而發(fā)生返回值出錯(cuò)的情況。在內(nèi)存管理時(shí)不推薦這種方式。

自動(dòng)釋放

將對(duì)象設(shè)置為自動(dòng)釋放意味著不需要明確地請(qǐng)求釋放,因?yàn)楫?dāng)自動(dòng)釋放池清空時(shí)它們將被自動(dòng)釋放。iPhone在主線(xiàn)程上運(yùn)行自動(dòng)釋放池,能夠在事件循環(huán)結(jié)束后釋放對(duì)象。當(dāng)你創(chuàng)建你自己的線(xiàn)程時(shí),你需要?jiǎng)?chuàng)建自己的自動(dòng)釋放池。

iPhone上有便利的構(gòu)造函數(shù),用這種方法創(chuàng)建的對(duì)象會(huì)設(shè)置為自動(dòng)釋放。

例子:

NSString* str0 = @"hello";

NSString* str1 = [NSString stringWithString:@"world"];

NSString* str2 = str1;

一個(gè)已分配的對(duì)象可以用如下的方法設(shè)置為自動(dòng)釋放:

NSString* str = [[NSString alloc] initWithString:@"the flash?"];

[str autorelease];

或者用下面的方法:

NSString* str = [[[NSString alloc] initWithString:@"batman!"] autorelease];

當(dāng)指針出界,或者當(dāng)自動(dòng)釋放池清空時(shí),自動(dòng)釋放對(duì)象上的所有權(quán)將被取消。

在一個(gè)事件循環(huán)結(jié)束時(shí),自動(dòng)釋放池內(nèi)的構(gòu)件通常會(huì)被清空。但是當(dāng)你的循環(huán)每次迭代都分配大量?jī)?nèi)存時(shí),你或許希望這不要發(fā)生。這種情況下,你可以在循 環(huán)內(nèi)創(chuàng)建自動(dòng)釋放池。自動(dòng)釋放池可以嵌套,所以?xún)?nèi)部池清空時(shí),其中分配的對(duì)象將被釋放。在下面的例子中,每次迭代后將釋放對(duì)象。

for (int i = 0; i < 10; ++i)

{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSString* str = [NSString stringWithString:@"hello world"];

[self ProcessMessage: str];

[pool drain];

}

注意:在編寫(xiě)的時(shí)候iPhone不支持垃圾回收,所以drain和release的功能相同。當(dāng)你想為程序設(shè)置OSX的端口時(shí)通常會(huì)使用drain,除非后來(lái)在iPhone中添加了垃圾回收機(jī)制。Drain能夠擊發(fā)垃圾回收器釋放內(nèi)存。

返回一個(gè)對(duì)象的指針

開(kāi)發(fā)者在遵循所有權(quán)規(guī)則時(shí)需要清楚哪些函數(shù)擁有對(duì)象的所有權(quán)。下面是返回一個(gè)對(duì)象的指針并釋放的例子。

錯(cuò)誤的方法:

- (NSMutableString*) GetOutput

{

NSMutableString* output = [[NSMutableString alloc] initWithString:@"output"];

return output;

}

- (void) Test

{

NSMutableString* obj = [self GetOutput];

NSLog(@"count: %d", [obj retainCount]);

[obj release];

}

在這個(gè)例子中,output 的所有者是 GetOutput,讓 Test 釋放 obj 違反了Coccoa內(nèi)存管理指南中的規(guī)則,盡管它不會(huì)泄露內(nèi)存但是這樣做不好,因?yàn)門(mén)est 不應(yīng)該釋放并非它所擁有的對(duì)象。

正確的方法:

- (NSMutableString*) GetOutput

{

NSMutableString* output = [[NSMutableString alloc] initWithString:@"output"];

return [output autorelease];

}

- (void) Test

{

NSMutableString* obj = [self GetOutput];

NSLog(@"count: %d", [obj retainCount]);

}

在第二個(gè)例子中,output 被設(shè)置為當(dāng) GetOutput 返回時(shí)自動(dòng)釋放。output的引用值減少,GetObject 釋放 output 的所有權(quán)。Test 函數(shù)現(xiàn)在可以自由的 retain 和 release 對(duì)象,請(qǐng)確保它不會(huì)泄露內(nèi)存。

例子中 obj 被設(shè)置為自動(dòng)釋放,所以 Test 函數(shù)沒(méi)有它的所有權(quán),但是如果它需要在其他地方存儲(chǔ)對(duì)象會(huì)怎樣?

此時(shí)對(duì)象需要有一個(gè)新的所有者來(lái)保留。

Setters

setter函數(shù)必須保留它所存儲(chǔ)的對(duì)象,也就是聲明所有權(quán)。如果我們想要?jiǎng)?chuàng)建一個(gè) setter 函數(shù),我們需要在分配一個(gè)新的指向成員變量的指針之前做兩件事情。

在函數(shù)里:

- (void) setName:(NSString*)newName

首先我們要減少成員變量的引用值:

[name release];

這將允許當(dāng)引用值為0時(shí) name 對(duì)象被釋放,但是它也允許對(duì)象的其他所有者繼續(xù)使用對(duì)象。

然后我們?cè)黾有碌?NSString 對(duì)象的引用值:

[newName retain];

所以當(dāng) setName 結(jié)束時(shí), newName 不會(huì)被取消分配。 newName 現(xiàn)在指向的對(duì)象和 name 指向的對(duì)象不同,兩者有不同的引用值。

現(xiàn)在我們?cè)O(shè)置 name 指向 newName 對(duì)象:

name = newName;

但是如果 name 和 newName 是同一個(gè)對(duì)象時(shí)怎么辦?我們不能在它被釋放后保留它,并再次釋放。

在釋放存儲(chǔ)的對(duì)象前保留新的對(duì)象:

[newName retain];

[name release];

name = newName;

現(xiàn)在兩個(gè)對(duì)象是相同的,先增加它的引用值,然后再減少,從而使得賦值前引用值不變。

另一種做法是使用 objective-c:

聲明如下:

@property(nonatomic, retain) NSString *name;

1. nonatomic 表示沒(méi)有對(duì)同一時(shí)間獲取數(shù)據(jù)的多個(gè)線(xiàn)程進(jìn)行組塊兒。Atomic 為一個(gè)單一的線(xiàn)程鎖定數(shù)據(jù),但因?yàn)?atomic 的方式比較緩慢,所以不是必須的情況一般不使用。

2. retain 表示我們想要保留 newName 對(duì)象。

我們可以使用 copy 代替 retain:

@property(nonatomic, copy) NSString *name;

這和下面的函數(shù)一樣:

- (void) setName:(NSString*)newName

{

NSString* copiedName = [newName copy];

[name release];

name = copiedName;

[name retain];

[copiedName release];

}

newName 在這里被復(fù)制到 copiedName,現(xiàn)在 copiedName 擁有串的一個(gè)副本。name 被釋放,而 copiedName 被賦給 name。之后 name 保留這個(gè)串,從而使得 copiedName 和 name 同時(shí)擁有它。最后 copiedName 釋放這個(gè)對(duì)象,name 成為這個(gè)串的唯一所有者。

如果我們有如下的函數(shù),像這樣的 setters 將被輸入用來(lái)保留成員對(duì)象:

- (void) Test

{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// do something...

name = [self GetOutput];

// do something else...

NSLog(@"Client Name before drain: %@", name);

[pool drain];

NSLog(@"Client Name after drain: %@", name);

}

name 在調(diào)用至 drain 后是未定義的,因?yàn)楫?dāng)池被釋放時(shí),name 也將被釋放。

如果我們用如下的部分替代賦值:

[self setName:[self GetOutput]];

然后 name 將被這個(gè)類(lèi)所有,在使用時(shí)保留直到調(diào)用 release

那么我們何時(shí)釋放對(duì)象?

由于 name 是成員變量,釋放它的最安全的辦法是對(duì)它所屬的類(lèi)使用 dealloc 函數(shù)。

- (void)dealloc

{

[name release];

[super dealloc];

}

注意:雖然并不總是調(diào)用 dealloc,依靠 dealloc 來(lái)釋放對(duì)象可能是危險(xiǎn),可能會(huì)觸發(fā)一些想不到的事情。在出口處,iPhone OS 可能在調(diào)用 dealloc 前清空全部應(yīng)用程序的內(nèi)存。

當(dāng)用 setter 給對(duì)象賦值時(shí),請(qǐng)小心下面的語(yǔ)句:

[self setName:[[NSString alloc] init]];

name 的設(shè)置是正確的但 alloc 沒(méi)有相應(yīng)的釋放,下面的方式要好一些:

NSString* s = [[NSString alloc] init];

[self setName:s];

[s release];

或者使用自動(dòng)釋放:

[self setName:[[[NSString alloc] init] autorelease]];

自動(dòng)釋放池

自動(dòng)釋放池釋放位于分配和 drain 函數(shù)之間的對(duì)象。

我們?cè)谙旅娴暮瘮?shù)中設(shè)置一個(gè)循環(huán),在循環(huán)中將 NSNumber 的一個(gè)副本賦給 magicNumber,另外將 magicNumber 設(shè)置為自動(dòng)釋放。在這個(gè)例子中,我們希望在每次迭代時(shí)清空自動(dòng)釋放池(這樣可以在賦值的數(shù)量很大時(shí)節(jié)省循環(huán)的內(nèi)存)

- (void) Test

{

NSString* clientName = nil;

NSNumber* magicNumber = nil;

for (int i = 0; i < 10; ++i)

{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

magicNumber = [[self GetMagicNumber] copy];

[magicNumber autorelease];

if (i == [magicNumber intValue])

{

clientName = [self GetOutput];

}

[pool drain];

}

if (clientName != nil)

{

NSLog(@"Client Name: %@", clientName);

}

}

這里存在的問(wèn)題是 clientName 在本地的自動(dòng)釋放池中被賦值和釋放,所以當(dāng)外部的池清空時(shí),clientName 已經(jīng)被釋放了,任何對(duì) clientName 的進(jìn)一步使用都是沒(méi)有定義的。

在這個(gè)例子中,我們?cè)谫x值后保留 clientName,直到結(jié)束時(shí)再釋放它:

- (void) Test

{

NSString* clientName = nil;

NSNumber* magicNumber = nil;

for (int i = 0; i < 10; ++i)

{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

magicNumber = [[self GetMagicNumber] copy];

[magicNumber autorelease];

if (i == [magicNumber intValue])

{

clientName = [self GetOutput];

[clientName retain];

}

[pool drain];

}

if (clientName != nil)

{

NSLog(@"Client Name: %@", clientName);

[clientName release];

}

}

我們?cè)谡{(diào)用 retain 函數(shù)和 release 函數(shù)的期間獲得 clientName 的所有權(quán)。通過(guò)添加一對(duì) retain 和 release 的調(diào)用,我們就確保 clientName 在明確調(diào)用釋放前不會(huì)被自動(dòng)釋放。

集合

當(dāng)一個(gè)對(duì)象被添加進(jìn)集合時(shí),它就被集合所擁有。在這個(gè)例子中我們分配一個(gè)串,它現(xiàn)在有了所有者;

NSString* str = [[NSString alloc] initWithString:@"Bruce Wayne"];

然后我們將它添加進(jìn)數(shù)組,現(xiàn)在它有兩個(gè)所有者:

[array addObject: str];

我們可以安全的釋放這個(gè)串,使其僅被數(shù)組所有:

[str release];

當(dāng)一個(gè)集合被釋放時(shí),其中的所有對(duì)象都將被釋放。

NSMutableArray* array = [[NSMutableArray alloc] init];

NSString* str = [[NSString alloc] initWithString:@"Bruce Wayne"];

[array addObject: str];

[array release];

在上面的例子中,我們分配了一個(gè)數(shù)組和一個(gè)串,然后將串添加到數(shù)組中并釋放數(shù)組。這使得串僅擁有一個(gè)所有者,并且在我們調(diào)用 [str release] 前它不會(huì)被釋放。

用線(xiàn)程傳遞指針

在這個(gè)函數(shù)中,我們從串的 input 傳遞到函數(shù) DoSomething,然后釋放 input

- (void) Test

{

NSMutableString* input = [[NSMutableString alloc] initWithString:@"batman!"];

[NSThread detachNewThreadSelector:@selector(DoSomething:) toTarget:self withObject:input];

[input release];

}

detatchNewThreadSelector 增加 input 對(duì)象的引用值并在線(xiàn)程結(jié)束時(shí)釋放它。這就是為什么我們能夠在線(xiàn)程剛開(kāi)始的時(shí)候就釋放 input,而無(wú)論函數(shù) DoSomething 何時(shí)開(kāi)始或結(jié)束。

- (void) DoSomething:(NSString*)str

{

[self performSelectorOnMainThread:@selector(FinishSomething:) withObject:str waitUntilDone:false];

}

performSeclectorOnMainThread 也會(huì)保留傳遞的對(duì)象,直到 selector 結(jié)束。

自動(dòng)釋放池是特殊的線(xiàn)程,所以如果我們?cè)谝粋€(gè)新的線(xiàn)程上創(chuàng)建自動(dòng)釋放的對(duì)象,我們需要?jiǎng)?chuàng)建一個(gè)自動(dòng)釋放池來(lái)釋放它們。

[NSThread detachNewThreadSelector:@selector(Process) toTarget:self withObject:nil];

這里在另一個(gè)線(xiàn)程上調(diào)用函數(shù) Process

- (void) Process

{

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSMutableString* output = [[[NSMutableString alloc] initWithString:@"batman!"] autorelease];

NSLog(@"output: %@", output);

[self performSelectorOnMainThread:@selector(FinishProcess) withObject:nil waitUntilDone:false];

[pool drain];

}

對(duì)象 output 被分配并且在自動(dòng)釋放池中設(shè)置了自動(dòng)釋放,它將在函數(shù)結(jié)束前被釋放。

- (void) FinishProcess

{

NSMutableString* output = [[[NSMutableString alloc] initWithString:@"superman?"] autorelease];

NSLog(@"output: %@", output);

}

系統(tǒng)會(huì)為主線(xiàn)程自動(dòng)創(chuàng)建一個(gè)自動(dòng)釋放池,所以在 FinishProcess 中,我們不需要為主線(xiàn)程上運(yùn)行的函數(shù)創(chuàng)建自動(dòng)釋放池。

更多信息請(qǐng)查看IT技術(shù)專(zhuān)欄

更多信息請(qǐng)查看技術(shù)文章
易賢網(wǎng)手機(jī)網(wǎng)站地址:如何避免iPhone應(yīng)用中內(nèi)存泄露
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢(xún)回復(fù)僅供參考,敬請(qǐng)考生以權(quán)威部門(mén)公布的正式信息和咨詢(xún)?yōu)闇?zhǔn)!

2026上岸·考公考編培訓(xùn)報(bào)班

  • 報(bào)班類(lèi)型
  • 姓名
  • 手機(jī)號(hào)
  • 驗(yàn)證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡(jiǎn)要咨詢(xún) | 簡(jiǎn)要咨詢(xún)須知 | 新媒體/短視頻平臺(tái) | 手機(jī)站點(diǎn) | 投訴建議
工業(yè)和信息化部備案號(hào):滇ICP備2023014141號(hào)-1 云南省教育廳備案號(hào):云教ICP備0901021 滇公網(wǎng)安備53010202001879號(hào) 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號(hào)
云南網(wǎng)警備案專(zhuān)用圖標(biāo)
聯(lián)系電話(huà):0871-65099533/13759567129 獲取招聘考試信息及咨詢(xún)關(guān)注公眾號(hào):hfpxwx
咨詢(xún)QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報(bào)警專(zhuān)用圖標(biāo)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲欧洲精品一区二区三区波多野1战4| 欧美一区不卡| 男人的天堂亚洲在线| 午夜欧美大片免费观看| 性欧美18~19sex高清播放| 亚洲一区二区三区视频播放| 亚洲欧美日韩在线| 久久亚洲风情| 欧美精品在线看| 国产亚洲精品久久久| 亚洲福利久久| 亚洲美洲欧洲综合国产一区| 中文欧美字幕免费| 久久精品亚洲一区二区三区浴池 | 午夜国产不卡在线观看视频| 老司机成人网| 国产精品一区在线观看| 国内精品久久久久伊人av| 亚洲精品在线观看视频| 久久久999| 国产精品多人| 99re6热只有精品免费观看| 久热成人在线视频| 狠狠色综合色综合网络| 欧美亚洲一区二区在线观看| 欧美美女喷水视频| 伊人久久综合97精品| 欧美自拍偷拍午夜视频| 国产麻豆成人精品| 亚洲女女做受ⅹxx高潮| 国产精品免费看久久久香蕉| 国产精品99久久久久久有的能看 | 一本一本久久a久久精品综合妖精 一本一本久久a久久精品综合麻豆 | 国产精品久久久久高潮| 亚洲欧洲综合| 欧美国产精品v| 亚洲国产日日夜夜| 欧美黑人在线观看| 亚洲人成毛片在线播放| 欧美 日韩 国产 一区| 亚洲电影在线免费观看| 欧美成人国产va精品日本一级| 好吊色欧美一区二区三区视频| 久久久99国产精品免费| 激情视频一区二区| 亚洲视频www| 国产精品男gay被猛男狂揉视频| 亚洲欧美激情精品一区二区| 国产亚洲永久域名| 亚洲精品欧美| 亚洲欧洲精品天堂一级| 久久成人国产精品| 韩国v欧美v日本v亚洲v| 久久视频这里只有精品| 狠狠色噜噜狠狠狠狠色吗综合| 国精品一区二区三区| 久久一区二区三区av| 久久综合久久综合久久综合| 亚洲第一天堂av| 另类国产ts人妖高潮视频| 亚洲黄色影院| 国产精品久久久久aaaa| 久久精品国产99精品国产亚洲性色 | 午夜精品免费| 国产一区久久| 欧美一级片一区| 国产欧美日韩不卡免费| 欧美一区二区视频观看视频| 欧美日韩一区二区三区四区在线观看 | 午夜精品久久久久影视 | 久久亚洲精选| 国语对白精品一区二区| 久久精品中文字幕一区| 亚洲美女黄色片| 国产精品久久久久免费a∨大胸 | 91久久久精品| 欧美日韩黄视频| 亚洲影院免费观看| 亚洲国产精品视频一区| 欧美亚洲成人免费| 欧美激情一区二区三区不卡| 亚洲视频欧美视频| 韩国一区二区三区在线观看| 国产精品yjizz| 久久综合色88| 一区二区三区高清在线 | 麻豆精品91| 国产精一区二区三区| 欧美成人激情视频| 午夜久久美女| 亚洲欧美亚洲| 亚洲天堂网站在线观看视频| 尤物精品在线| 欧美日韩不卡| 久久精品99国产精品酒店日本| 一区二区三区精品视频| 1024日韩| 狠狠色噜噜狠狠色综合久 | 欧美日产在线观看| 麻豆久久精品| 亚洲黑丝在线| 在线一区二区视频| 欧美日本在线视频| 亚洲美女一区| 亚洲愉拍自拍另类高清精品| 国产日产亚洲精品系列| 国产精品人人爽人人做我的可爱| 久久综合成人精品亚洲另类欧美| 99riav1国产精品视频| 一区二区在线观看视频在线观看 | 欧美在线啊v一区| 欧美日韩mv| 欧美日韩亚洲在线| 欧美午夜在线| 国产精品无人区| 久久久综合香蕉尹人综合网| 在线观看av一区| 亚洲成色最大综合在线| 欧美日韩精品是欧美日韩精品| 欧美另类69精品久久久久9999| 欧美高清视频一区二区三区在线观看 | 国产精品欧美一区二区三区奶水| 欧美在线不卡| 欧美主播一区二区三区| 欧美在线国产| 午夜精品久久久久久久久久久| 亚洲国产成人tv| 欧美在线亚洲综合一区| 久久中文字幕导航| 欧美日韩色婷婷| 国产日韩欧美成人| 在线播放日韩| 日韩视频在线一区二区| 亚洲影院在线观看| 欧美在线黄色| 欧美高清不卡| 国产精品久久一区主播| 狠狠色综合播放一区二区| 亚洲欧洲久久| 午夜精品理论片| 欧美国产高清| 国产日韩欧美91| 99xxxx成人网| 久久精品亚洲| 国产精品成人一区二区艾草| 影音先锋日韩资源| 亚洲午夜一区| 久久久精品免费视频| 欧美大片网址| 国产综合视频在线观看| 日韩视频专区| 免费欧美日韩| 国产区在线观看成人精品| 亚洲日本中文| 欧美在线综合视频| 欧美视频官网| 亚洲欧洲在线观看| 久久亚洲视频| 国产视频欧美| 亚洲美女中文字幕| 亚洲影院在线观看| 欧美日韩国产欧| 亚洲国产aⅴ天堂久久| 性欧美超级视频| 久久青草欧美一区二区三区| 国产精品久久久久久久久搜平片| 黄色成人91| 性做久久久久久| 欧美调教视频| 一区二区三区久久网| 欧美黑人在线播放| 亚洲青涩在线| 男男成人高潮片免费网站| 国产一区二区三区久久悠悠色av| 亚洲一区二区免费看| 国产精品第一页第二页第三页| 日韩视频免费大全中文字幕| 欧美激情1区| 亚洲乱码国产乱码精品精天堂| 欧美国产一区二区在线观看| 在线观看日韩av电影| 久久一区亚洲| 韩国三级在线一区| 久久男人av资源网站| 亚洲第一精品夜夜躁人人爽| 久久久久久亚洲综合影院红桃| 国产日韩欧美另类| 久久久精品999| 一区二区三区在线不卡| 免费高清在线一区| 亚洲精品久久久一区二区三区| 欧美精品一卡二卡| 99精品视频免费全部在线| 国产精品扒开腿爽爽爽视频 | 免费不卡视频| 极品日韩久久| 欧美.日韩.国产.一区.二区| 国产欧美精品在线播放| 久久久精品免费视频| 亚洲欧洲综合另类|