日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

iOS 开发:彻底理解 iOS 内存管理(MRC 篇)

發布時間:2024/3/12 编程问答 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 开发:彻底理解 iOS 内存管理(MRC 篇) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
  • 本文首發于我的個人博客:「程序員充電站」
  • 文章鏈接:「傳送門」
  • 本文更新時間:2021年08月17日17:11:59

本文是 「iOS 開發:徹底理解 iOS 內存管理」系列的「MRC 篇」。
用來對 Objective-C 語法中,手動管理內存 MRC 相關知識進行講解。

1. 什么是內存管理

程序在運行的過程中,往往涉及到創建對象、定義變量、調用函數或方法,而這些行為都會增加程序的內存占用。

而一個移動設備的內存是有限的,每個軟件所能占用的內存也是有限的。

當程序所占用的內存較多時,系統就會發出內存警告,這時就得回收一些不需要再使用的內存空間。比如回收一些不需要再使用的對象、變量等。

如果程序占用內存過大,系統可能會強制關閉程序,造成程序崩潰、閃退現象,影響用戶體驗。

所以,我們需要對 「內存」 進行合理的分配內存、清除內存,回收不需要再使用的對象。從而保證程序的穩定性。

在 iOS 中,我們通常將內存分為五大部分:

  • 代碼區:用于存放程序的代碼,即 CPU 執行的機器指令,并且是只讀的。
  • 全局區 / 靜態區:它主要存放靜態數據、全局數據和常量。分為未初始化全局區(BSS 段)、初始化全局區:(數據段)。程序結束后由系統釋放。
    • 數據段:用于存放可執行文件中已經初始化的全局變量,也就是用來存放靜態分配的變量和全局變量。
    • BSS 段:用于存放程序中未初始化的全局變量。
  • 常量區:用于存儲已經初始化的常量。程序結束后由系統釋放。
  • 棧區(Stack):用于存放程序臨時創建的變量、存放函數的參數值、局部變量等。由編譯器自動分配釋放。
  • 堆區(Heap):用于存放進程運行中被動態分配的內存段。它大小不固定,可動態擴張和縮減。由程序員分配和釋放。

從上邊內存的各個部分說明可以看出:只有堆區存放的數據需要由程序員分配和釋放。

堆區存放的,主要是繼承了 NSObject 的對象,需要由程序員進行分配和釋放。其他非對象類型(int、char、float、double、struct、enum 等)則存放在棧區,由系統進行分配和釋放。

  • 示例:
int main(int argc, const char * argv[]) {@autoreleasepool {int a = 10; // 棧int b = 20; // 棧// p : 棧// Person 對象(計數器 == 1): 堆Person *p = [[Person alloc] init];}// 經過上面代碼后, 棧里面的變量 a、b、p 都會被回收// 但是堆里面的 Person 對象還會留在內存中,因為它是計數器依然是 1return 0; } image

2. 內存管理機制

移動端的內存管理機制,主要有三種:

  • 自動垃圾收集(GC)
  • 手工引用計數和自動釋放池(MRC)
  • 自動引用計數(ARC)

其中 iOS 運行環境不支持自動垃圾收集機制(GC)。蘋果公司使用的是手工引用計數(MRC)和自動引用計數(ARC)機制。

在自動引用計數(ARC)出現機制之前,一直是通過手工引用計數(MRC)機制這種手寫大量管理代碼的方式來管理內存。后來蘋果公司開發了自動引用計數(ARC)技術,把這部分工作交給了編譯器來完成,從而大大簡化了開發工作。但是 ARC 依然還是需要注意循環引用的問題。

下面來詳細講解一下「手工引用計數(MRC)」和「自動引用計數(ARC)」。


3. MRC 手動管理內存(Manual Reference Counting)

3.1 引用計數器

引用計數器:
一個整數,表示為「對象被引用的次數」。系統需要根據對象的引用計數器來判斷對象是否需要被回收。

從字面意義上,可以把引用計數器理解為「對象被引用的次數」,也可以理解為: 「有多少人正在用這個對象」。

系統根據引用計數器的機制來判斷對象是否需要被回收。在每次 RunLoop 迭代結束后,都會檢查對象的引用計數器,如果引用計數器等于 0,則說明該對象沒有地方繼續使用它了,可以將其釋放掉。

關于「引用計數器」,有以下幾個特點:

  • 每個 OC 對象都有自己的引用計數器。
  • 任何一個對象,剛創建的時候,初始的引用計數為 1。
    • 即使用 alloc、new 或者 copy 創建一個對象時,對象的引用計數器默認就是 1。
  • 當沒有任何人使用這個對象時,系統才會回收這個對象。也就是說:
    • 當對象的引用計數器為 0 時,對象占用的內存就會被系統回收。
    • 如果對象的引用計數器不為 0 時,那么在整個程序運行過程,它占用的內存就不可能被回收(除非整個程序已經退出)。

3.2 引用計數器操作

  • 為保證對象的存在,每當創建引用到對象需要給對象發送一條 retain 消息,可以使引用計數器值 +1 ( retain 方法返回對象本身)。
  • 當不再需要對象時,通過給對象發送一條 release 消息,可以使引用計數器值 -1。
  • 給對象發送 retainCount 消息,可以獲得當前的引用計數器值。
  • 當對象的引用計數為 0 時,系統就知道這個對象不再需要使用了,所以可以釋放它的內存,通過給對象發送 dealloc 消息發起這個過程。
  • 需要注意的是:release 并不代表銷毀 / 回收對象,僅僅是將計數器 -1。
int main(int argc, const char * argv[]) {@autoreleasepool {// 只要創建一個對象默認引用計數器的值就是 1。Person *p = [[Person alloc] init];NSLog(@"retainCount = %lu", [p retainCount]); // 打印 1// 只要給對象發送一個 retain 消息, 對象的引用計數器就會 +1。[p retain];NSLog(@"retainCount = %lu", [p retainCount]); // 打印 2// 通過指針變量 p,給 p 指向的對象發送一條 release 消息。// 只要對象接收到 release 消息, 引用計數器就會 -1。// 只要對象的引用計數器為 0, 系統就會釋放對象。[p release];// 需要注意的是: release 并不代表銷毀 / 回收對象, 僅僅是將計數器 -1。NSLog(@"retainCount = %lu", [p retainCount]); // 1[p release]; // 0NSLog(@"--------");} // [p setAge:20]; // 此時對象已經被釋放return 0; }

3.3 dealloc 方法

  • 當一個對象的引用計數器值為 0 時,這個對象即將被銷毀,其占用的內存被系統回收。
  • 對象即將被銷毀時系統會自動給對象發送一條 dealloc 消息(因此,從 dealloc 方法有沒有被調用,就可以判斷出對象是否被銷毀)
  • dealloc 方法的重寫(注意是在 MRC 中)
    • 一般會重寫 dealloc 方法,在這里釋放相關資源,dealloc 就是對象的遺言
    • 一旦重寫了 dealloc 方法,就必須調用 [super dealloc],并且放在最后面調用。
- (void)dealloc {NSLog(@"Person dealloc");// 注意:super dealloc 一定要寫到所有代碼的最后面[super dealloc]; }

dealloc 使用注意:

  • 不能直接調用 dealloc 方法。
  • 一旦對象被回收了, 它占用的內存就不再可用,堅持使用會導致程序崩潰(野指針錯誤)。

3.4 野指針和空指針

  • 只要一個對象被釋放了,我們就稱這個對象為「僵尸對象(不能再使用的對象)」。
  • 當一個指針指向一個僵尸對象(不能再使用的對象),我們就稱這個指針為「野指針」。
  • 只要給一個野指針發送消息就會報錯(EXC_BAD_ACCESS 錯誤)。
int main(int argc, const char * argv[]) {@autoreleasepool {Person *p = [[Person alloc] init]; // 執行完引用計數為 1。[p release]; // 執行完引用計數為 0,實例對象被釋放。[p release]; // 此時,p 就變成了野指針,再給野指針 p 發送消息就會報錯。[p release]; // 報錯}return 0; }
  • 為了避免給野指針發送消息會報錯,一般情況下,當一個對象被釋放后我們會將這個對象的指針設置為空指針。
  • 空指針:
    • 沒有指向存儲空間的指針(里面存的是 nil, 也就是 0)。
    • 給空指針發消息是沒有任何反應的。
int main(int argc, const char * argv[]) {@autoreleasepool {Person *p = [[Person alloc] init]; // 執行完引用計數為 1。[p release]; // 執行完引用計數為 0,實例對象被釋放。p = nil; // 此時,p 變為了空指針。[p release]; // 再給空指針 p 發送消息就不會報錯了。[p release];}return 0; }

3.5 內存管理思想

3.5.1 單個對象內存管理思想

思想一:自己創建的對象,自己持有,自己負責釋放
  • 通過 alloc、new、copy 或 mutableCopy 方法創建并持有對象。
  • 當自己持有的對象不再被需要時,必須調用 release 或 autorelease 方法釋放對象。
id obj = [[NSObject alloc] init]; // 自己創建的對象,自己持有 [obj release];

同樣,new 方法也能持有對象:

id obj = [NSObject new]; // 自己創建的對象,自己持有 [obj release];

而由各類實現的 copyWithZone: 方法和 mutableCopyWithZone: 方法將生成并持有對象的副本。

另外,除了上面四種方法之外,由上面四種方法名稱開頭的方法名,也將生成并持有對象:

  • allocMyObject
  • newMyObject
  • copyMyObject
  • mutableCopyMyObject
思想二:非自己創建的對象,自己也能持有
  • 除了用上面方法(alloc / new / copy / mutableCopy 方法)所取得的的對象,因為非自己生成并持有,所以自己不是該對象的持有者。
  • 通過調用 retain 方法,即便是非自己創建的對象,自己也能持有對象。
  • 同樣當自己持有的對象不再被需要時,必須調用 release 方法來釋放對象。
id obj = [NSMutableArray array]; // 取得非自己生成的變量,但自己并不持有。 [obj retain]; // 通過 retain 方法持有對象 [obj release];
總結:
  • 無論是否是自己創建的對象,自己都可以持有,并負責釋放。
  • 計數器有加就有減。
  • 曾經讓對象的計數器 +1,就必須在最后讓對象計數器 -1。

3.5.2 多個對象內存管理思想

多個對象之間往往是通過 setter 方法產生聯系的,其內存管理的方法也是在 setter 方法、dealloc 方法中實現的。所以只有了解了 setter 方法是如何實現的,我們才能了解到多個對象之間的內存管理思想。接下來我們將從零開始,一步步實現 setter 方法,了解多個對象之間的內存管理思想。

我們用一個線上斗地主游戲例子來類比一下。假如有一款斗地主游戲,游戲大廳有不同的游戲房間,可供玩家選擇。我們定義游戲房間為 Room 類對象,定義玩家為 Person 類對象,玩家對象擁有 _room 作為成員變量。

一個玩家對象,如果想要玩游戲,就要持有一個房間對象,并保證在使用房間期間,這個房間對象一直存在,并且在游戲房間沒人的時候,還需要將這個房間對象釋放。

根據上面的描述,我們可以制定以下規則:

  • 只要一個玩家想使用房間(進入房間),就需要對這個游戲房間的引用計數器 +1。
  • 只要一個玩家不想再使用房間(離開房間),就需要對這個游戲房間的引用計數器 -1。
  • 只要還有至少一個玩家在用某個房間,那么這個游戲房間就不會被回收,引用計數至少為 1。
image

下面來定義兩個類 玩家類:Person 和 房間類:Room。

  • 房間類(Room 類)
#import <Foundation/Foundation.h>@interface Room : NSObject @property int no; // 房間號 @end
  • 玩家類(Person 類)
#import <Foundation/Foundation.h> #import "Room.h"@interface Person : NSObject {Room *_room; }- (void)setRoom:(Room *)room;- (Room *)room; @end

現在我們通過幾個玩家使用房間的不同應用場景來逐步深入理解內存管理。

1. 玩家沒有使用房間的情況
int main(int argc, const char * argv[]) {@autoreleasepool {// 1. 創建兩個對象Person *p = [[Person alloc] init]; // 玩家 pRoom *r = [[Room alloc] init]; // 房間 rr.no = 888; // 房間號賦值[r release]; // 釋放房間[p release]; // 釋放玩家}return 0; }

上述代碼執行完第 4~6 行,即:

// 1.創建兩個對象 Person *p = [[Person alloc] init]; // 玩家 p Room *r = [[Room alloc] init]; // 房間 r r.no = 888; // 房間號賦值

之后在內存中的表現如下圖所示:

image

可見,Room 實例對象和 Person 實例對象之間沒有相互聯系,所以各自釋放不會報錯。執行完第 8~9 行代碼,即:

[r release]; // 釋放房間 [p release]; // 釋放玩家

后,將房間對象和玩家對象各自釋放掉,在內存中的表現如下圖所示:

image

最后各自實例對象的內存就會被系統回收。

2. 一個玩家使用一個游戲房間的情況
int main(int argc, const char * argv[]) {@autoreleasepool {// 1. 創建兩個對象Person *p = [[Person alloc] init]; // 玩家 pRoom *r = [[Room alloc] init]; // 房間 rr.no = 888; // 房間號賦值// 將房間賦值給玩家,表示玩家在使用房間// 玩家需要使用這間房,只要玩家在,房間就一定要在p.room = r; // [p setRoom:r][r release]; // 釋放房間// 在這行代碼之前,玩家都沒有被釋放,但是因為玩家還在,那么房間就不能銷毀NSLog(@"-----");[p release]; // 釋放玩家}return 0; }

上邊代碼執行完第 4~6 行的時候和之前在內存中的表現一樣,如圖所示:

image

當執行完第 10 行代碼 p.room = r; 時,因為調用了 setter 方法,將 Room 實例對象賦值給了 Person 的成員變量,不做其他設置的話,在內存中的表現如下圖(做法不對):

image

在調用 setter 方法的時候,因為 Room 實例對象多了一個 Person 對象引用,所以應將 Room 實例對象的引用計數 +1 才對,即 setter 方法應該像下邊一樣,對 room 進行一次 retain 操作。

- (void)setRoom:(Room *)room { // 調用 room = r;// 對房間的引用計數器 +1[room retain];_room = room; }

那么執行完第 10 行代碼 p.room = r;,在內存中的表現為:

image

繼續執行第 12 行代碼[r release];,釋放房間,Room 實例對象引用計數 -1,在內存中的表現如下圖所示:

image

然后執行第 17 行代碼 [p release];,釋放玩家。這時候因為玩家不在房間里了,房間也沒有用了,所以在釋放玩家的時候,要把房間也釋放掉,也就是在 delloc 里邊對房間再進行一次 release 操作。

這樣對房間對象來說,每一次 retain / alloc 操作都對應一次 release 操作。

- (void)dealloc {// 人釋放了, 那么房間也需要釋放[_room release];NSLog(@"%s", __func__);[super dealloc]; }

那么在內存中的表現最終如下圖所示:

image

最后實例對象的內存就會被系統回收

3. 一個玩家使用一個游戲房間 r 后,換到另一個游戲房間 r2 的情況
int main(int argc, const char * argv[]) {@autoreleasepool {// 1. 創建兩個對象Person *p = [[Person alloc] init]; // 玩家 pRoom *r = [[Room alloc] init]; // 房間 rr.no = 888; // 房間號賦值// 2. 將房間 r 賦值給玩家 p,表示玩家 p 在使用房間 rp.room = r; // [p setRoom:r][r release]; // 釋放房間 r// 3. 換房Room *r2 = [[Room alloc] init];r2.no = 444;p.room = r2;[r2 release]; // 釋放房間 r2[p release]; // 釋放玩家 p}return 0; }

執行下邊幾行代碼:

// 1. 創建兩個對象 Person *p = [[Person alloc] init]; // 玩家 p Room *r = [[Room alloc] init]; // 房間 r r.no = 888; // 房間號賦值// 2. 將房間 r 賦值給玩家 p,表示玩家 p 在使用房間 r p.room = r; // [p setRoom:r] [r release]; // 釋放房間 r

之后的內存表現為:

image

接著執行換房操作而不進行其他操作的話,即:

// 3. 換房 Room *r2 = [[Room alloc] init]; r2.no = 444; p.room = r2;

后的內存表現為:

image

最后執行完代碼:

[r2 release]; // 釋放房間 r2 [p release]; // 釋放玩家 p

后的內存表現為:

image
可以看出房間 r 并沒有被釋放,這是因為在進行換房的時候,并沒有對房間 r 進行釋放。所以應在調用 setter 方法的時候,對之前的變量進行一次 release 操作。具體 setter 方法代碼如下:- (void)setRoom:(Room *)room { // room = r// 將以前的房間釋放掉 -1[_room release];// 對房間的引用計數器 +1[room retain];_room = room;} }

這樣在執行完 p.room = r2; 之后就會將 房間 r 釋放掉,最終內存表現為:

image
4. 一個玩家使用一個游戲房間,不再使用游戲房間,將游戲房間釋放掉之后,再次使用該游戲房間的情況
int main(int argc, const char * argv[]) {@autoreleasepool {// 1. 創建兩個對象Person *p = [[Person alloc] init];Room *r = [[Room alloc] init];r.no = 888;// 2. 將房間 r 賦值給玩家 pp.room = r; // [p setRoom:r][r release]; // 釋放房間 r// 3. 再次使用房間 rp.room = r;[r release]; // 釋放房間 r[p release]; // 釋放玩家 p}return 0; }

執行下面代碼:

// 1.創建兩個對象 Person *p = [[Person alloc] init]; Room *r = [[Room alloc] init]; r.no = 888;// 2.將房間賦值給人 p.room = r; // [p setRoom:r] [r release]; // 釋放房間 r

之后的內存表現為:

image

然后再執行 p.room = r;,因為 setter 方法會將之前的 Room 實例對象先釋放掉,此時內存表現為:

image

此時 _room、r 已經變成了一個野指針。之后再對野指針 r 發出 retain 消息,程序就會崩潰。所以我們在進行 setter 方法的時候,要先判斷一下是否是重復賦值,如果是同一個實例對象,就不需要重復進行 release 和 retain。換句話說,如果我們使用的還是之前的房間,那換房的時候就不需要對這個房間再進行 release 和 retain。則 setter 方法具體代碼如下:

- (void)setRoom:(Room *)room { // room = r// 只有房間不同才需用 release 和 retainif (_room != room) { // 0ffe1 != 0ffe1// 將以前的房間釋放掉 -1[_room release];// 對房間的引用計數器+1[room retain];_room = room;} }

因為 retain 不僅僅會對引用計數器 +1, 而且還會返回當前對象,所以上述代碼可最終簡化成:

- (void)setRoom:(Room *)room { // room = r// 只有房間不同才需用 release 和 retainif (_room != room) { // 0ffe1 != 0ffe1// 將以前的房間釋放掉 -1[_room release];_room = [room retain];} }

以上就是 setter 方法的終極形式。通過上面多個例子,我們也理解了多個對象之間的內存管理思想。

3.6 @property 參數

  • 在成員變量前加上 @property,系統就會自動幫我們生成基本的 setter / getter 方法,但是不會生成內存管理相關的代碼。
@property (nonatomic) int val;
  • 同樣如果在 property 后邊加上 assign,系統也不會幫我們生成 setter 方法內存管理的代碼,僅僅只會生成普通的 getter / setter 方法,默認什么都不寫就是 assign。
@property(nonatomic, assign) int val;
  • 如果在 property 后邊加上 retain,系統就會自動幫我們生成 getter / setter 方法內存管理的代碼,但是仍需要我們自己重寫 dealloc 方法。
@property(nonatomic, retain) Room *room;

3.7 自動釋放池

當我們不再使用一個對象的時候應該將其空間釋放,但是有時候我們不知道何時應該將其釋放。為了解決這個問題,Objective-C 提供了 autorelease 方法。

  • autorelease 是一種支持引用計數的內存管理方式,只要給對象發送一條 autorelease 消息,會將對象放到一個自動釋放池中,當自動釋放池被銷毀時,會對池子里面的「所有對象」做一次 release 操作。

注意:這里只是發送 release 消息,如果當時的引用計數(reference-counted)依然不為 0,則該對象依然不會被釋放。

  • autorelease 方法會返回對象本身,且調用完 autorelease 方法后,對象的計數器不變。
Person *p = [Person new]; p = [p autorelease]; NSLog(@"count = %lu", [p retainCount]); // 計數還為 1

3.7.1 使用 autorelease 有什么好處呢?

  • 不用再關心對象釋放的時間
  • 不用再關心什么時候調用release

3.7.2 autorelease 的原理實質上是什么?

autorelease 實際上只是把對 release 的調用延遲了,對于每一個 autorelease,系統只是把該對象放入了當前的 autorelease pool 中,當該 pool 被釋放時,該 pool 中的所有對象會被調用 release 方法。

3.7.3 autorelease 的創建方法

  • 使用 NSAutoreleasePool 創建
  • NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; // 創建自動釋放池 [pool release]; // [pool drain]; 銷毀自動釋放池
  • 使用 @autoreleasepool 創建
  • @autoreleasepool { // 開始代表創建自動釋放池} // 結束代表銷毀自動釋放池

    3.7.4 autorelease 的使用方法

    NSAutoreleasePool *autoreleasePool = [[NSAutoreleasePool alloc] init]; Person *p = [[[Person alloc] init] autorelease]; [autoreleasePool drain]; @autoreleasepool { // 創建一個自動釋放池Person *p = [[Person new] autorelease];// 將代碼寫到這里就放入了自動釋放池 } // 銷毀自動釋放池(會給池子中所有對象發送一條 release 消息)

    3.7.5 autorelease 的注意事項

    • 并不是放到自動釋放池代碼中,都會自動加入到自動釋放池
    @autoreleasepool {// 因為沒有調用 autorelease 方法,所以對象沒有加入到自動釋放池Person *p = [[Person alloc] init];[p run]; }
    • 在自動釋放池的外部發送 autorelease 不會被加入到自動釋放池中
      • autorelease 是一個方法,只有在自動釋放池中調用才有效。
    @autoreleasepool { } // 沒有與之對應的自動釋放池, 只有在自動釋放池中調用autorelease才會放到釋放池 Person *p = [[[Person alloc] init] autorelease]; [p run];// 正確寫法 @autoreleasepool {Person *p = [[[Person alloc] init] autorelease];}// 正確寫法 Person *p = [[Person alloc] init]; @autoreleasepool {[p autorelease]; }

    3.7.6 自動釋放池的嵌套使用

    • 自動釋放池是以棧的形式存在。
    • 由于棧只有一個入口,所以調用 autorelease 會將對象放到棧頂的自動釋放池。

    棧頂就是離調用 autorelease 方法最近的自動釋放池。

    @autoreleasepool { // 棧底自動釋放池@autoreleasepool {@autoreleasepool { // 棧頂自動釋放池Person *p = [[[Person alloc] init] autorelease];}Person *p = [[[Person alloc] init] autorelease];} }
    • 自動釋放池中不適宜放占用內存比較大的對象。
      • 盡量避免對大內存使用該方法,對于這種延遲釋放機制,還是盡量少用。
      • 不要把大量循環操作放到同一個 @autoreleasepool 之間,這樣會造成內存峰值的上升。
    // 內存暴漲 @autoreleasepool {for (int i = 0; i < 99999; ++i) {Person *p = [[[Person alloc] init] autorelease];} } // 內存不會暴漲 for (int i = 0; i < 99999; ++i) {@autoreleasepool {Person *p = [[[Person alloc] init] autorelease];} }

    3.7.7 autorelease 錯誤用法

    • 不要連續調用 autorelease。
    @autoreleasepool {// 錯誤寫法, 過度釋放Person *p = [[[[Person alloc] init] autorelease] autorelease];}
    • 調用 autorelease 后又調用 release(錯誤)。
    @autoreleasepool {Person *p = [[[Person alloc] init] autorelease];[p release]; // 錯誤寫法, 過度釋放 }

    3.8 MRC 中避免循環引用

    定義兩個類 Person 類和 Dog 類

    • Person 類:
    #import <Foundation/Foundation.h> @class Dog;@interface Person : NSObject @property(nonatomic, retain)Dog *dog; @end
    • Dog 類:
    #import <Foundation/Foundation.h> @class Person;@interface Dog : NSObject @property(nonatomic, retain)Person *owner; @end

    執行以下代碼:

    int main(int argc, const char * argv[]) {Person *p = [Person new];Dog *d = [Dog new];p.dog = d; // retaind.owner = p; // retain assign[p release];[d release];return 0; }

    就會出現 A 對象要擁有 B 對象,而 B 對應又要擁有 A 對象,此時會形成循環 retain,導致 A 對象和 B 對象永遠無法釋放。

    那么如何解決這個問題呢?

    • 不要讓 A retain B,B retain A。
    • 讓其中一方不要做 retain 操作即可。
    • 當兩端互相引用時,應該一端用 retain,一端用 assign。

    參考資料

    • 【書籍】Objective-C 高級編程 iOS 與 OS X 多線程和內存管理
    • 【博文】《Objective-C 高級編程》干貨三部曲(一):引用計數篇

    總結

    以上是生活随笔為你收集整理的iOS 开发:彻底理解 iOS 内存管理(MRC 篇)的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    天天干夜夜擦 | 免费福利在线观看 | 国产精品久久久久久久久久久久午夜片 | 欧美精品久久久久久久亚洲调教 | 国产一区二区视频在线 | 日韩欧美视频二区 | 日日干夜夜骑 | 一级黄色片在线 | 啪啪免费视频网站 | 亚洲永久精品国产 | 欧美精品在线观看 | 欧美日韩精品久久久 | 欧美精品久久久久久久久久丰满 | 99电影456麻豆 | 亚洲日本va午夜在线影院 | 色天天综合久久久久综合片 | 精品特级毛片 | av在线电影免费观看 | 精品麻豆入口免费 | 亚洲精品玖玖玖av在线看 | 嫩嫩影院理论片 | 天天操天天曰 | 在线免费观看黄色小说 | 日韩动漫免费观看高清完整版在线观看 | 国产精品欧美久久久久久 | 日韩免费在线观看视频 | 九九视频精品免费 | 五月婷婷网站 | 丁香婷婷在线 | 日日麻批40分钟视频免费观看 | 五月天激情电影 | 欧美精品久久久 | 国产精品2020 | 九九九热精品免费视频观看网站 | 国产精品久久久久一区二区 | 国产精品美女久久 | 色吊丝在线永久观看最新版本 | 国产永久免费高清在线观看视频 | 99久久久久久久 | 五月在线视频 | 在线视频1卡二卡三卡 | 日韩欧美黄色网址 | 欧美人牲| 麻豆小视频在线观看 | 国产精品午夜在线观看 | 国产成人在线播放 | 黄a网| 亚洲人成网站精品片在线观看 | 日本69hd| 久久久久国 | 伊人狠狠 | 波多野结衣在线视频一区 | 日韩av进入| 天天综合网天天综合色 | 日韩欧美精品在线 | 久久精品99久久 | 免费久久久 | 91精品啪在线观看国产线免费 | 色视频国产直接看 | 国产成人精品一区二区 | 国产精品久久麻豆 | 成人免费观看网站 | 在线观看视频国产一区 | 人人爽人人澡 | 久久综合久久综合九色 | 国产免费又爽又刺激在线观看 | 久久人网 | 波多野结衣一区二区三区中文字幕 | 久久深夜福利免费观看 | 国产成人99久久亚洲综合精品 | 日本在线中文在线 | 日韩一二区在线 | 日韩欧美综合 | 亚洲另类视频在线观看 | 一区 二区电影免费在线观看 | 欧美精品中文在线免费观看 | 精品免费 | 九九免费在线观看视频 | 国产视频一 | 美女很黄免费网站 | 国产涩涩网站 | 国产乱老熟视频网88av | 国产精品久久久久久久免费大片 | 成年人免费在线观看网站 | 成人av网页| 中文字幕视频一区 | 激情视频区 | 日日夜夜精品网站 | 中文在线字幕观看电影 | 久久999久久| 玖玖在线观看视频 | 日韩在线观看一区二区三区 | 精品久久网站 | 亚洲国产午夜 | 在线免费观看一区二区三区 | 久久久精品一区二区 | 亚洲高清在线精品 | 国产精品入口麻豆www | 黄色软件视频大全免费下载 | 久久精品99国产国产 | 国产成人a亚洲精品v | 久久国产精品99久久久久 | 玖玖在线观看视频 | 成年人视频在线免费播放 | 国产在线视频一区二区 | www.天天综合 | 中文字幕久久精品亚洲乱码 | 欧美日韩国产二区三区 | 狠狠狠狠狠狠狠 | 国产精品www | 免费一级片视频 | 成人免费观看电影 | 97视频在线免费 | 亚洲成aⅴ人片久久青草影院 | 欧美日韩一区二区视频在线观看 | 国产精品精品久久久 | 亚洲国产中文字幕在线 | 又黄又色又爽 | 在线三级播放 | 黄色电影网站在线观看 | 成人网色| 欧美色综合久久 | 国产精品一二三 | 久久色网站 | 网址你懂的在线观看 | 有码中文字幕在线观看 | 玖玖999| 亚洲综合视频在线 | 精品视频久久久 | 爱色婷婷| 91系列在线 | 国产h在线观看 | 一二三区av | 国产不卡网站 | 探花视频在线观看免费 | 久久这里只有精品久久 | 91精品免费在线观看 | 日韩免费在线网站 | 2021久久| 欧美日韩精品影院 | 欧美精品久久久久久久久老牛影院 | 国产小视频在线免费观看视频 | 中文字幕在线免费97 | 亚洲春色奇米影视 | 亚洲婷婷网 | 一性一交视频 | 久久久久 免费视频 | 久久国产经典视频 | 九九久久影院 | av在线收看 | 色亚洲激情 | 国产精品免费一区二区 | 久综合网 | 成人亚洲欧美 | 欧美成人按摩 | 久久永久免费视频 | 国产手机在线播放 | 午夜国产成人 | 精品一区二区电影 | 狠狠色婷婷丁香六月 | 久久久久久久久久网站 | 一级黄色片在线播放 | 麻豆网站免费观看 | av不卡中文| 久久国产午夜精品理论片最新版本 | 久久久蜜桃 | 欧美成人播放 | 黄色动态图xx | 日韩首页| 国产无遮挡猛进猛出免费软件 | 久久久久国产一区二区三区 | 成人在线免费视频 | 久久综合九色99 | 亚洲视频h | 特级黄色视频毛片 | 超碰午夜| 久久久久亚洲精品中文字幕 | 日韩av在线高清 | 在线观看亚洲电影 | 国产日韩精品一区二区 | 亚洲国产大片 | 国产99久久久国产 | 欧美午夜精品久久久久 | 美女视频久久黄 | www五月 | 久久久久久久久久网站 | 欧美 日韩 成人 | 超碰国产人人 | 激情六月婷婷久久 | 激情五月六月婷婷 | 久久精彩免费视频 | 欧美在线视频a | 亚洲精品久久久久58 | 日韩欧美专区 | 99热在线免费观看 | 一级黄色片毛片 | 精品久久精品久久 | 久久久麻豆精品一区二区 | 欧美日韩精品综合 | 天天射天天 | 亚洲精品白浆高清久久久久久 | av女优中文字幕在线观看 | 久久字幕精品一区 | 日日干 天天干 | 免费成人结看片 | 久爱精品在线 | 啪啪小视频网站 | 香蕉色综合 | 成人午夜电影久久影院 | 日韩精品一区二区三区电影 | 激情影音先锋 | 免费h视频 | 四季av综合网站 | 亚洲国产精品一区二区久久,亚洲午夜 | 在线精品视频在线观看高清 | 91久久丝袜国产露脸动漫 | 国产日韩欧美自拍 | 亚洲欧美国产精品 | 久久综合九九 | ,午夜性刺激免费看视频 | 国产一区欧美一区 | 美女一区网站 | 久久精品视频在线播放 | 国产黄色av | 激情综合亚洲精品 | 91视频网址入口 | 五月婷婷激情 | 日本性xxx| 精品久久片| 在线观看黄色 | 三级av网 | 久久国产精品视频 | 一区二区三区高清不卡 | 国产又粗又硬又长又爽的视频 | 伊人狠狠色 | 中文字幕av影院 | 日韩午夜电影网 | 日本精品一区二区三区在线播放视频 | 麻豆91视频| 69久久久久久久 | 97在线观视频免费观看 | 国产aaa毛片| 久久久国产精品麻豆 | av高清一区二区三区 | 日韩视频免费 | 粉嫩av一区二区三区四区五区 | 欧美综合色在线图区 | 在线观看91网站 | 99精品国产福利在线观看免费 | 欧美精品乱码久久久久久 | 欧美电影黄色 | 九九三级毛片 | 亚洲电影久久 | 狠狠操.com | 日本最新中文字幕 | av资源免费在线观看 | 国产午夜在线 | 在线观看日韩精品 | 操操操人人 | 成人av高清在线观看 | 亚洲一区日韩精品 | 亚洲黄色影院 | 亚洲成av片人久久久 | 亚洲码国产日韩欧美高潮在线播放 | 日日爱999 | 三级a视频 | 久草免费在线视频观看 | 欧美性生爱 | 在线激情小视频 | 精品一区在线 | 在线观看岛国av | 天天操天天操天天爽 | 日韩欧美一区二区三区视频 | 久久亚洲电影 | 国产精品乱码一区二区视频 | 在线观看成人 | 一级黄色片在线播放 | 亚洲精品乱码久久久久v最新版 | 五月婷婷在线综合 | 在线观看免费高清视频大全追剧 | 草免费视频 | 日本天天操 | 久久精国产 | 欧美日韩国产在线 | 99riav1国产精品视频 | 欧美午夜激情网 | 五月天色站 | 国产精品不卡在线观看 | 国产在线精品一区二区不卡了 | 99热精品国产一区二区在线观看 | 久久国产精品99久久久久久丝袜 | 麻豆传媒一区二区 | 一级黄毛片 | www久久久久 | 中文在线字幕免费观 | 亚洲国产中文在线观看 | 午夜精品久久久久99热app | 欧美一级日韩三级 | 国产精品久久中文字幕 | 国产视频2 | 国产在线超碰 | 日本mv大片欧洲mv大片 | 91看片淫黄大片一级在线观看 | 综合五月 | 久久久久国产精品www | 中文字幕视频观看 | 91精品国产自产老师啪 | 偷拍精偷拍精品欧洲亚洲网站 | 国产日韩精品在线 | 日韩一区二区三免费高清在线观看 | 国产福利久久 | 最近中文字幕完整视频高清1 | 久久大香线蕉app | 欧美精品在线观看一区 | 久久国语 | 黄污网站在线 | 国产色婷婷在线 | 久久五月婷婷丁香社区 | 91免费网 | 一区二区三区国产精品 | 国产一区国产精品 | 日韩在线无 | 男女视频国产 | 国产一级精品绿帽视频 | 男女啪啪视屏 | 九九久久国产 | 一区二区三区在线播放 | a午夜在线| 国产精品18久久久久久久久久久久 | 日韩精品免费 | 日韩成人一级大片 | 在线成人欧美 | 精品国产免费人成在线观看 | 国产精品久久久久久久久久直播 | 亚洲最大色| 午夜av大片| 久久久久免费电影 | 国产成人高清av | 国产一二区免费视频 | 日韩三级中文字幕 | 精品女同一区二区三区在线观看 | 亚洲一区av | 国产精品video爽爽爽爽 | 日韩免费视频观看 | 在线看中文字幕 | 又黄又爽又刺激的视频 | 成人久久久久 | 免费国产一区二区视频 | 国产视频色| 国产在线 一区二区三区 | 毛片网站观看 | 天天射一射| 成人免费大片黄在线播放 | 国产精品麻 | 日本特黄一级 | 久久久鲁| 亚洲成人xxx | 色香蕉在线视频 | 日韩在线免费高清视频 | 成人欧美一区二区三区黑人麻豆 | 激情欧美日韩一区二区 | 黄色大全在线观看 | 黄色aa久久 | 99久久久国产免费 | 国产精品久久久久久久久久久不卡 | 日日摸日日碰 | 91久久精品一区二区二区 | 亚洲一区精品二人人爽久久 | 国产黄在线看 | 91高清免费看 | 亚洲无人区小视频 | 久久乐九色婷婷综合色狠狠182 | 日韩在线免费高清视频 | 亚洲影院一区 | 国产亚洲精品av | 中文字幕一区二区三区久久蜜桃 | 国产一区二区久久久久 | www久久国产 | 国产成人三级三级三级97 | 一级特黄av| 免费成人在线电影 | 亚洲视屏 | 国产精品久久久久久久午夜片 | 人人超在线公开视频 | 奇米影视8888在线观看大全免费 | 中文在线字幕免 | 精品视频国产一区 | 欧美亚洲精品在线观看 | 国产精品美女免费视频 | 91免费网站在线观看 | 日韩最新中文字幕 | 日韩在线观看视频一区二区三区 | 国产一二三四在线观看视频 | 欧美一级淫片videoshd | 在线观看免费视频你懂的 | 91丨九色丨91啦蝌蚪老版 | 欧美天堂视频在线 | 黄色亚洲片 | 国产精品久久久久av免费 | 激情欧美一区二区免费视频 | 久久免费视频在线 | 久久久国产精品一区二区三区 | 国产精品99久久久精品 | 久久国产精品视频观看 | 久久视频在线 | 国产免费xvideos视频入口 | 西西444www| 91av在线免费 | 一级黄色a视频 | 伊人久久影视 | 欧美日韩国产一区二区三区在线观看 | 国产1区在线 | 国产精品久久婷婷六月丁香 | 久久国产精品色婷婷 | 国产精品三级视频 | 成人网在线免费视频 | 日本黄色一级电影 | 91天堂影院 | 免费看黄色小说的网站 | 91视视频在线直接观看在线看网页在线看 | 国产婷婷| 韩国av在线 | 福利在线看片 | 亚洲一二视频 | 国产伦理一区二区 | 国产精品入口a级 | 亚洲综合五月天 | 天天骚夜夜操 | 午夜av大片 | 国产精品99视频 | 中文字幕人成乱码在线观看 | 国产日韩欧美在线观看 | 欧美午夜a | 国产精久久久久久妇女av | 成人在线你懂得 | 奇米影视777影音先锋 | 国产一区二区三区免费视频 | 69国产精品视频 | 一区在线观看 | 精品欧美一区二区精品久久 | 国产手机在线视频 | 日韩视频一区二区在线 | 韩国av永久免费 | 日本精品va在线观看 | 欧美日本不卡高清 | av不卡中文字幕 | 国产91在线看 | 国产精品久久久区三区天天噜 | 超碰97免费观看 | 色激情五月 | 久久乱码卡一卡2卡三卡四 五月婷婷久 | 久久人人爽人人爽人人片av软件 | www.精选视频.com | 超碰97在线资源站 | 天天色播| 国产无套一区二区三区久久 | 亚洲色图美腿丝袜 | 久久字幕网 | 日本护士三级少妇三级999 | 国产专区欧美专区 | 福利视频一区二区 | 美女视频黄的免费的 | 天天艹天天干天天 | 91亚洲精品在线观看 | 成人网在线免费视频 | 亚洲伊人网在线观看 | 五月婷av | 国产在线高清视频 | 欧美男女爱爱视频 | 五月婷婷激情 | 国产精品涩涩屋www在线观看 | 91免费在线视频 | 毛片区 | 欧美一区二区伦理片 | 99久久婷婷国产综合亚洲 | 国产精品久久久久9999吃药 | 色婷婷免费 | 久久香蕉影视 | 国产91精品在线观看 | 久久免费观看少妇a级毛片 久久久久成人免费 | www免费 | 手机看片国产 | 在线视频中文字幕一区 | 亚洲不卡在线 | 亚洲激情在线视频 | 国产精品va在线播放 | av片中文| 深夜福利视频一区二区 | 日韩中文字幕免费看 | 91丨九色丨蝌蚪丨对白 | www五月天| 色人久久 | 亚洲精品视频免费观看 | 亚洲欧洲国产日韩精品 | 亚洲 欧美 变态 国产 另类 | 亚洲综合成人专区片 | 麻豆视频大全 | 天天干天天色2020 | 久久综合九色综合欧美狠狠 | 激情五月播播久久久精品 | www亚洲一区 | 久久综合九色综合97_ 久久久 | 亚洲精品黄色 | 丁香婷婷基地 | 精品国产成人av | 久久激情五月激情 | www.久久91 | 成人久久久电影 | 成人黄色小视频 | 欧美日韩国产色综合一二三四 | 99精品视频精品精品视频 | 99热精品国产一区二区在线观看 | 成人一区二区三区中文字幕 | 91大神免费在线观看 | 国产在线观看免费观看 | 亚洲精品中文在线 | 久久久男人的天堂 | 99在线免费观看视频 | 99久久99久久精品国产片果冰 | 国产精品久久久久久久久久久免费 | 国产又粗又猛又黄 | 在线观av| 夜夜夜夜猛噜噜噜噜噜初音未来 | 天天爽人人爽夜夜爽 | 中文字幕有码在线观看 | 婷婷在线播放 | 中文字幕在线视频一区二区 | 日韩在线看片 | 免费高清男女打扑克视频 | 91亚洲欧美 | 欧美日韩视频在线播放 | 免费看黄电影 | 97在线资源 | 中文字幕文字幕一区二区 | 天天骚夜夜操 | 欧美激情综合色综合啪啪五月 | 91精品啪在线观看国产线免费 | 色五月色开心色婷婷色丁香 | 91精品一区二区三区久久久久久 | 国产精品国产三级在线专区 | 天天射天天 | 国产一级视频在线 | 中文在线中文a | 欧美日韩在线播放一区 | 一本一道波多野毛片中文在线 | 国产精品大尺度 | 中文字幕电影一区 | 正在播放久久 | 91干干干| 国产欧美精品一区二区三区 | 久草香蕉在线视频 | 色在线视频网 | 在线精品亚洲一区二区 | 成人av中文字幕在线观看 | 黄色毛片大全 | 99精品电影 | 色中色亚洲 | 狠狠综合 | 欧美日韩一区二区三区在线免费观看 | 色婷婷综合久色 | 韩日精品中文字幕 | 黄污视频网站 | 久久天天躁夜夜躁狠狠躁2022 | 91精品国产91久久久久久三级 | 午夜视频色 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 91免费试看 | 亚洲精品综合一区二区 | 亚洲伊人第一页 | 黄色一级大片免费看 | 综合五月| 中文字幕电影高清在线观看 | 久久免费精品 | 日韩精品无码一区二区三区 | 中文字幕视频播放 | 久久免费视频在线 | 91亚洲国产成人久久精品网站 | 国产欧美最新羞羞视频在线观看 | 成人久久免费 | 中文字幕在线看视频 | 九九在线国产视频 | 婷婷综合亚洲 | www免费看片com| av日韩在线网站 | 久久久资源 | www久| 超碰在线观看av.com | 欧美日韩国产精品一区二区 | 婷婷丁香国产 | 久久免费av电影 | 青青河边草免费 | 国产视频一区二区在线播放 | 免费a级观看 | 国产乱对白刺激视频在线观看女王 | 久久久久久久久黄色 | 色久综合 | 欧美黑人猛交 | 久久免费播放视频 | 成人av在线一区二区 | 69av视频在线 | 婷婷视频在线播放 | 激情动态 | 精品国产资源 | 精品中文字幕在线播放 | 欧日韩在线视频 | 国产精品久久久久久一区二区 | 亚洲国内精品视频 | 日日摸日日爽 | av久久在线 | 最近中文字幕mv免费高清在线 | 91精品久久香蕉国产线看观看 | 6080yy午夜一二三区久久 | 在线观看av大片 | 91在线产啪 | 婷婷综合五月天 | 狠狠色噜噜狠狠狠 | 国产美女在线观看 | 国产成人精品在线 | 欧美在线视频一区二区三区 | 欧美精品三级在线观看 | 国产精品自产拍在线观看 | 中文字幕av免费 | 欧美日韩国产一区二区三区在线观看 | av电影中文 | 欧美激情va永久在线播放 | 欧美精品在线一区 | 久亚洲 | 久久草草热国产精品直播 | 91av综合| 久草免费在线观看视频 | 久久精品99久久久久久 | 国产精品初高中精品久久 | 久久激情影院 | 97香蕉超级碰碰久久免费软件 | 日韩精品一区二区三区在线播放 | 国产黄色片免费观看 | 亚洲国产精彩中文乱码av | 丁香婷婷激情啪啪 | 深爱开心激情网 | 天海冀一区二区三区 | 天天色视频 | 日韩欧美在线免费观看 | 91资源在线视频 | 欧美日韩调教 | 成人网在线免费视频 | 婷婷伊人综合亚洲综合网 | 丁香六月五月婷婷 | 色视频在线免费 | 婷婷国产精品 | 丁香电影小说免费视频观看 | 日韩黄在线观看 | 国产精品一区二区三区99 | 69av网| 日本久久久精品视频 | 九精品 | 国产喷水在线 | 国产 字幕 制服 中文 在线 | 欧洲亚洲女同hd | 国内精品一区二区 | 中文字幕一区二区三区四区视频 | 六月婷色| 亚洲婷婷综合色高清在线 | 高清不卡一区二区在线 | 欧美贵妇性狂欢 | 综合网久久| 国产精品专区在线 | 国产精品美女久久久久久久网站 | 成人午夜免费剧场 | 国产精品一区二区麻豆 | 激情av资源 | 日韩中文字幕免费在线播放 | 国产a国产 | 久久久www成人免费毛片麻豆 | 久草在线视频国产 | 美国人与动物xxxx | 亚洲电影久久 | 色成人亚洲 | 亚洲精品www | 国产色婷婷精品综合在线手机播放 | 青草草在线视频 | 欧美日韩中文在线观看 | www黄色 | 天天草av | 91在线视频免费播放 | 五月天最新网址 | 日韩va欧美va亚洲va久久 | a级一a一级在线观看 | 国产91国语对白在线 | 天天鲁一鲁摸一摸爽一爽 | 97在线免费观看 | 免费观看www小视频的软件 | 粉嫩av一区二区三区入口 | 亚洲香蕉在线观看 | 一区二区中文字幕在线播放 | 亚洲狠狠婷婷综合久久久 | 日韩成人在线一区二区 | 国产精品门事件 | 亚洲五月| 欧美 日韩 视频 | 91av视频免费观看 | 精品福利视频在线观看 | 日日婷婷夜日日天干 | 人人添人人澡 | 亚洲视频,欧洲视频 | 欧美性色综合 | 天天摸日日摸人人看 | 日韩区视频 | 亚洲精品毛片一级91精品 | 日本不卡一区二区 | 免费观看完整版无人区 | 日日干干 | 成人黄色片免费看 | 尤物97国产精品久久精品国产 | 国产三级午夜理伦三级 | 狠狠色伊人亚洲综合网站色 | 婷婷五综合 | 99久久精品免费看国产一区二区三区 | 国产原创av在线 | 精品久久久网 | 一区二区不卡 | 久久九九国产精品 | 最新中文字幕视频 | 午夜精品视频免费在线观看 | 五月婷婷一区 | 国产自在线观看 | 国产黄色一级片在线 | 国产成人精品av在线 | 香蕉在线视频观看 | 在线观看中文字幕av | 西西www4444大胆在线 | 在线视频麻豆 | 五月婷香| av色网站| 欧美色精品天天在线观看视频 | 五月婷久久| 91成人在线看 | av在线一二三区 | 亚洲精品18日本一区app | 亚洲成人精品av | 国产精品国产三级国产 | 黄色av高清| 亚洲成人精品影院 | 久久精品韩国 | 激情网色 | 精品久久久久久久久久久久久久久久久久 | 久久精品国产美女 | 免费在线观看成人av | 99精品视频在线播放观看 | 国产女人18毛片水真多18精品 | 伊在线视频 | 成人黄大片视频在线观看 | 91热| 国产高清在线精品 | 美女av免费看 | 亚洲乱码精品 | 可以免费观看的av片 | 精品亚洲欧美一区 | 精品国产乱码一区二区三区在线 | 天天色天天色 | 欧美精品做受xxx性少妇 | 高清不卡一区二区在线 | 色综合久久88色综合天天 | 成人国产一区 | 香蕉久久久久久av成人 | 激情五月婷婷综合网 | 亚洲国产免费av | 免费久久99精品国产婷婷六月 | a视频在线观看免费 | a黄在线观看 | 91久久久久久久一区二区 | 夜夜婷婷 | 久久综合狠狠综合久久综合88 | 国产精品99久久久久的智能播放 | 区一区二区三区中文字幕 | 毛片888 | 91看片看淫黄大片 | 国产九九热视频 | 日韩三级久久 | 午夜电影中文字幕 | 欧美作爱视频 | 免费看污片| 天天干天天弄 | 亚欧日韩成人h片 | 青青久草在线 | 免费人成在线观看 | 久久综合激情 | 欧美在线观看视频 | 亚洲国产午夜精品 | 国产不卡av在线 | 国产一区国产二区在线观看 | 久久久福利视频 | 国产黑丝一区二区三区 | 天天操天天操一操 | 免费久久网站 | 成人xxxx| 欧美亚洲久久 | 久久久精品久久 | 欧美一区二区三区特黄 | 在线视频 91| 国产一二区视频 | 久久区二区 | adc在线观看 | 国产免费又粗又猛又爽 | 亚洲黄色激情小说 | 99久久精品免费一区 | 天天操天天色天天 | 国产精品资源在线 | 久久久午夜精品理论片中文字幕 | 夜色.com| 国产精品久久久久久久久久久久冷 | 欧美性做爰猛烈叫床潮 | www五月婷婷 | 久久久久久国产精品免费 | 91精品人成在线观看 | 久久精品国产久精国产 | 四虎影视成人永久免费观看视频 | 亚洲伦理精品 | 最新91在线视频 | 天天操天天射天天舔 | 日韩精品在线视频免费观看 | 中文字幕成人在线 | 国产玖玖在线 | 亚洲欧美视频在线观看 | 久久久综合精品 | wwwwww国产 | 国产天天爽| 免费看搞黄视频网站 | 7777xxxx| av网址最新 | 亚洲综合精品在线 | 国产精品一区二区三区久久 | 成人在线播放免费观看 | 日日操夜| 亚洲成人资源在线 | 色网址99| 在线观看岛国av | 香蕉久草 | 午夜精品视频一区二区三区在线看 | 中文字幕在线看视频国产 | 天天天干天天射天天天操 | 香蕉久草 | a视频免费在线观看 | 亚洲一级二级 | 欧美激情xxxx性bbbb | 免费在线播放黄色 | 国产最新在线视频 | 四虎亚洲精品 | 免费在线播放黄色 | 狠狠干狠狠久久 | 国产精品久久久精品 | 西西www4444大胆视频 | 久久99中文字幕 | 天天干天天拍天天操 | 在线观看你懂的网站 | 91在线porny国产在线看 | 精品视频在线免费 | 成人免费视频播放 | 日韩高清精品免费观看 | 91精品在线免费观看视频 | 中文字幕在线国产精品 | 最新av电影网站 | 天天干天天插 | 亚洲激情在线 | 国产91aaa | 国产精品成人a免费观看 | 国产美女久久久 | 国产中文字幕一区 | 美女免费视频一区 | 五月婷婷在线观看 | va视频在线观看 | 久久精品视频在线看 | 99久久一区| av成人动漫 | 国产一级在线播放 | 久久久久久久久久久福利 | 香蕉视频网站在线观看 | 成人黄色电影在线播放 | 国产精品免费视频观看 | 久av在线 | 国内精品久久久久久久久久久久 | 国产免费又粗又猛又爽 | 99久热在线精品 | 天堂在线视频中文网 | 久久草av | 国产精品久久久久久久久久直播 | 国产精品毛片一区视频 | 国产成人香蕉 | 国产亚洲欧美在线视频 | 干亚洲少妇 | 久久这里只有精品视频首页 | 亚州av免费| 人人插人人玩 | 国产精品久久艹 | 视频二区 | 日韩电影在线观看一区二区 | 黄色av影视| 五月天网站在线 | 97人人模人人爽人人喊中文字 | 婷婷色中文网 | 欧美精品久久久久a | 天天操天天干天天爽 | 国产一区二区三区网站 | 免费一级片久久 | 99av在线视频 | 色婷婷一区 | 国产成人精品久久久久蜜臀 | 中文在线√天堂 | 国产综合片 | 97国产电影 | 亚洲欧洲一区二区在线观看 | 日韩国产精品久久 | 日韩av黄 | 国内久久精品视频 | 狠狠操夜夜操 | 亚洲精品99久久久久中文字幕 | 日韩欧美国产免费播放 | 日韩高清 一区 | 色福利网 | 亚洲精品视频第一页 | 蜜桃视频色 | 免费日韩电影 | 亚洲精品乱码久久久久久 | 亚洲国产日韩在线 | 黄色小视频在线观看免费 | 国产 在线观看 | 色欧美日韩 | 国产精品久久久视频 | 成年人在线观看免费视频 | www.av在线.com | 成人观看 | 色香蕉视频| 久久免费看| 999成人 | 综合网在线视频 | 精品国产午夜 | 国产91电影在线观看 | 91理论片午午伦夜理片久久 | 国产精品午夜免费福利视频 | 欧美精品午夜 | 成年人免费看 | 天天拍夜夜拍 | 免费看的黄色 | 91精品国产乱码在线观看 | 91免费视频网站在线观看 | 91黄色免费网站 | 国产精品精品国产色婷婷 | 激情伊人五月天 | 黄色一级大片免费看 | 免费精品国产va自在自线 | 在线观看av免费观看 | 丁香午夜 | www.夜夜操| 成人国产精品电影 | 韩国av永久免费 | www.天堂av| 一区二区三区在线免费播放 | 天天在线操 | 日b视频国产 | 少妇bbb搡bbbb搡bbbb′ | 亚洲精品tv久久久久久久久久 | 国产精品成人国产乱一区 | 欧美亚洲成人xxx | 人人射人人澡 | 中文字幕av在线电影 | 天天干,夜夜爽 | 午夜国产一区二区 | 有没有在线观看av | 免费日韩视频 | 国产成人精品一区二区三区 | 国产精品原创av片国产免费 | 夜夜躁日日躁狠狠久久88av | 五月婷婷天堂 | 国产91综合一区在线观看 | 欧美精品一区二区在线播放 | 日本三级不卡视频 | 亚洲一区二区三区四区在线视频 | 久久精品女人毛片国产 | 国产 在线 高清 精品 | 国产精品毛片久久久久久久 | 五月天婷婷狠狠 | 久久久久久免费视频 | 中文字幕在线看片 | 国产在线播放不卡 | 色诱亚洲精品久久久久久 | 日日干夜夜爱 | 久久草网站 | 日韩视频精品在线 | 成年人国产视频 | 特级西西444www高清大视频 | 亚洲天堂精品 | 999久久国精品免费观看网站 | 日韩理论视频 | 午夜视频二区 | 有码一区二区三区 | 在线观看免费观看在线91 | 久久精品影片 | 欧美a影视 | 久久论理 |