日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

iOS 內存管理

瀏覽:30日期:2022-09-17 13:44:25
1. 引用計數

iOS 的引用計數就類似于下圖中進出辦公室的開關燈流程。當一個人A進入前,辦公室的引用數為0,進入后需要照明,因此開燈,引用數為1,B進入后,引用數為2,C 進入后引用數為3,以此類推。A 離開時,引用數-1,當最后一個人離開辦公室時,引用數為0,不再需要照明,因此關燈。

iOS 內存管理開關燈

對應到 OC 對象的動作時,開燈=生成對象(allocnewcopymutableCopy),需要照明=持有對象(retain),不需要照明=釋放對象(release),關燈=廢棄對象(dealloc)。

iOS 內存管理引用計數的內存管理1.1 內存管理的原則自己生成的對象,自己持有也可持有非自己生成的對象釋放不再需要自己持有的對象非自己持有的對象無法釋放

注意這些原則里的一些關鍵詞與方法的對應關系:『生成』- allocnewcopymutableCopy『持有』- retain『釋放』- release『廢棄』- dealloc

下面分別來解釋一下,這四條原則的含義:

1.1.1 自己生成的對象,自己持有

id obj = [[NSObject alloc] init]; id obj = [NSObject new]; id obj = [NSObject copy]; id obj = [NSObject mutableCopy]; // 注意 allocnewcopymutableCopy 開頭的駝峰式方法名,也生成并持有對象 id obj = [MyObject allocMyObj]; id obj = [MyObject newThatObj]; id obj = [MyObject copyThis]; id obj = [MyObject mutableCopyThat];

注意allocnewcopymutableCopy 開頭非駝峰式命名的方法不適用上述規則。例如:allocatenewercopyingmutableCopyed。

1.1.2 非自己生成的對象,也可持有

id obj = [NSMutableArray array];

obj是非『allocnewcopymutableCopy』或以其開頭的駝峰式命名方法創建,因此屬于非自己生成的對象。如何持有對象呢?用 retain 啊~

id obj = [NSMutableArray array];[obj retain];1.1.3 釋放不再需要自己持有的對象

用allocnewcopymutableCopy』或以其開頭的駝峰式命名方法生成并持有的對象,在不再需要的時候,要用 release 方法釋放。

id obj = [[NSMutableArray alloc] init]; // do Something... [obj release];

id obj = [NSMutableArray array];[obj retain]; // do Something... [obj release];1.1.4 非自己持有的對象無法釋放

釋放非自己持有的對象時,會發生崩潰,例如

1)同一個對象被多次釋放:

id obj = [[NSMutableArray alloc] init];[obj release];[obj release];

2)釋放非自己持有的對象:

id obj = [obj0 object]; [obj release]; // obj 既不是 allocnewcopymutableCopy 出來的,也沒有 retain,因此沒有被持有,不可以被釋放2. autorelease

有一個跟 release 類似的關鍵詞autorelease,看這樣一段代碼:

- (id)object { id obj = [[NSMutableArray alloc] init]; [obj autorelease]; return obj;}

obj 對象在什么時候被釋放呢?與 release 的區別是什么?

iOS 內存管理release和 autorelease 的區別

對象被 release 時,引用計數-1,當引用計數為0時,該對象被立即釋放。而對象被 autorelease 時,引用計數不變,該對象被注冊到自動釋放池中,在一個運行周期結束時,自動釋放池被傾倒(池中注冊的對象被 release)。

autorelease 類似 C 語言中的局部變量的特性,局部變量超過其作用域時會被自動廢棄,autorelease 對待對象實例與之類似。當超出 autorelease 的作用域時,對象實例的 release 方法被調用。與 C 語言局部變量不同的是,autorelease 可以設置其作用域。

for(int i = 0;i < 10000; i ++){ @autoreleasepool { // 在一個 runloop 周期內產生大量對象的代碼 }}

除了上述場景,總結一下需要顯式調用 autoreleasepool 的情況:

顯式使用@autoreleasepool:

autorelease 機制基于 UI framework,因此寫 非UI framework的程序時,需要自己管理對象生存周期。

autorelease 觸發時機發生在下一次runloop的時候。因此如何在一個大的循環里不斷創建autorelease對象,那么這些對象在下一次runloop回來之前將沒有機會被釋放,可能會耗盡內存。這種情況下,可以在循環內部顯式使用@autoreleasepool {}將autorelease 對象釋放。

for (item in BigSet){ @autoreleasepool { //create large mem objects }}

自己創建的線程。Cocoa的應用都會維護自己autoreleasepool。因此,代碼里spawn的線程,需要顯式添加autoreleasepool。

很長的函數、很多中間變量時。正常情況下,你創建的變量會在超出其作用域的時候被釋放掉。而如果函數寫的很長,在函數運行過程中出現很多中間變量,占據了大量的內存,怎么辦?用@autoreleasepool。在@autoreleasepool中創建的變量,會在@autoreleasepool結束的時候執行一次release,進行釋放。其實@autoreleasepool就相當于一層作用域。

3. ARC的規則

ARC 是從 iOS5出現的編譯器新特性,對引用采取自動計數,不再需要手動的對對象進行 retain 和 release,編譯器代替我們來做這件事了。

可以通過設置配置文件,在同一個項目中既有 ARC 也有 MRC(例如受老項目或老第三方庫影響,需要在 ARC 項目中加入 MRC 的類)。

在 ARC 項目中用到 MRC:在targets的build phases選項下Compile Sources下選擇要不使用arc編譯的文件,雙擊,輸入 -fno-objc-arc ; 在 MRC 中用到 ARC:同上步驟,選擇要使用arc編譯的文件,雙擊,輸入 -fobjc-arc ;3.1 所有權修飾符

ARC 同 MRC 一樣,仍使用引用計數,仍適用1.1中內存管理的4條原則。ARC為何能自動釋放呢?關鍵因素就是—— ARC 中增加了4種所有權修飾符:

__strong__weak__unsafe_unretained__autoreleasing

其中,__strong__weak__autoreleasing對修飾的局部變量初始化為 nil。

以下著重介紹常用的__strong__weak修飾符.

3.1.1 __strong

__strong 是 id 類型、對象類型的默認所有權修飾符,在 ARC 有效時不需要顯式寫出,如以下兩行代碼在 ARC 下是相同的:

id obj = [[NSObject alloc] init]; id __strong obj = [[NSObject alloc] init];

__strong 修飾符表示對對象強引用,在超過作用域時廢棄,釋放所引用的對象及其成員。相當于 MRC 中對該對象調用 release 方法。

__strong在 ARC中是如何實現 MRC的功能的?對比 MRC,MRC 通過手動寫[obj release]來釋放自己創建并持有的內存;

ARC 通過增加所有權修飾符這個概念,對 id|對象類型自己創建且持有的對象默認添加__strong 修飾符,從手動寫 release 語句變為通過作用域控制對象及其成員的釋放。

ARC 對非自己創建但持有的對象,也通過默認添加 __strong修飾符強引用,使其持有(相當于 MRC 中 retain 語句)對象。

回顧 MRC 內存管理的4條原則:

自己生成的對象,自己持有也可持有非自己生成的對象釋放不再需要自己持有的對象非自己持有的對象無法釋放

『自己生成的對象,自己持有』『也可持有非自己生成的對象』,ARC 中對 id對象類型默認添加__strong 修飾符進行強引用;『釋放不再需要自己持有的對象』變量作用域結束成員所屬對象廢棄對變量賦值都可以滿足這條;『非自己持有的對象無法釋放』ARC 中不再需要寫 release 語句,因此這條也滿足。因此 ARC 也是完全遵守 MRC 內存管理的原則的。

3.1.2 __weak

為解決__strong 導致的循環引用問題,進而造成內存泄露(廢棄的對象在超出其生存周期后繼續存在),需要引入 _weak 修飾符,對造成循環引用的對象進行弱引用。當作用域結束時,被強引用的對象廢棄,弱引用的對象自動被置為 nil。

3.1.3 __unsafe_unretained

iOS4之前用,類似__weak(iOS 5),但需要在使用被其修飾的變量時,先判斷是否存在。

3.1.4 __autorelease

autorelease 修飾符同strong 一樣一般不顯式寫出。在 MRC中,通過 NSAutoreleasePool 對象的聲明和 drain 代碼之間調用 autorelease 進行自動釋放。在 ARC中,把需要自動釋放的代碼寫在@autorelease{// code ...}中,當區間內非 allocnewcopymutableCopyinit 的對象會被自動加入 autoreleasepool,在作用域結束的時候釋放。如下圖:

iOS 內存管理MRCARC的自動釋放對比5. ARC 的規則不能顯式使用 retainreleaseretainCountautorelease不能使用 NSAllocateObjectNSDeallocateObject要遵守內存管理的方法命名規則(allocnewcopymutableCopy init)不顯式調用 dealloc使用@autoreleasepool 替代 NSAutoreleasePool不使用 NSZone對象型變量不能作為 C 語言結構體成員顯式轉換 id 和 void*

來源:簡書

標簽: IOS
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩不卡免费高清视频| 日韩毛片在线| 极品裸体白嫩激情啪啪国产精品| 日韩激情精品| 日本欧美一区| 日韩和欧美一区二区三区| 伊人久久成人| av资源亚洲| 精品视频高潮| 日韩中文在线电影| 日本不卡中文字幕| 国产另类在线| 99久久精品费精品国产| 超碰在线99| 亚洲欧美日本视频在线观看| 亚洲青青久久| 久久uomeier| 欧美一区二区三区久久精品| 欧美日韩亚洲一区三区| 欧美99久久| 综合亚洲自拍| 久久久亚洲一区| 日本不卡免费高清视频在线| 日韩高清在线不卡| 亚久久调教视频| 2023国产精品久久久精品双| 亚洲精品影院在线观看| 美女高潮久久久| 午夜日韩av| 欧美中文字幕| 另类av一区二区| 深夜视频一区二区| 99re国产精品| 国产私拍福利精品视频二区| caoporn视频在线| 亚洲精品进入| 中文视频一区| 欧美gv在线| 久久精品国内一区二区三区水蜜桃| 久久久久中文| 精品国产乱码久久久久久1区2匹| 日精品一区二区三区| 日本精品影院| 蜜桃久久久久久| 麻豆久久一区二区| 激情偷拍久久| 国产精品亚洲欧美| 国产亚洲观看| 蜜臀久久99精品久久久久久9 | 老司机免费视频一区二区三区| 精品视频97| 亚洲黄页一区| 久久免费影院| 在线综合亚洲| 成人亚洲欧美| 国产精品成人国产| 日韩精品一级中文字幕精品视频免费观看 | 欧美精品99| 99国产精品| 岛国精品一区| 免费看久久久| 免播放器亚洲一区| 国产视频一区二| 国产精品免费99久久久| 综合激情一区| 国产精品99久久久久久董美香| 国产999精品在线观看| 欧美日韩国产v| 日韩一区精品视频| 日韩精品永久网址| 国产亚洲毛片| 久久uomeier| 狠狠干成人综合网| 国产一区不卡| 久久一区精品| 国产免费播放一区二区| 性一交一乱一区二区洋洋av| 在线天堂资源www在线污| 欧美精品日日操| 人人精品人人爱| 亚洲久草在线| 国产精品magnet| 亚洲欧美在线综合| 欧美日韩一区二区三区不卡视频 | 97精品视频在线看| 日韩精品一级| 久久wwww| 精品亚洲免a| 欧美激情另类| 日韩精品免费视频人成| www成人在线视频| 蜜臀久久99精品久久久久宅男 | 亚洲一区观看| 精品久久久网| 欧美精品一区二区三区精品| 老司机精品视频网| 国产日韩免费| 日韩av不卡一区二区| 国产精品观看| 国产女人18毛片水真多18精品| 久久成人av| 国产日韩1区| 天堂av在线一区| 亚洲成人一区在线观看| 蜜桃视频第一区免费观看| 蜜臀精品一区二区三区在线观看 | 国产在线日韩| 亚洲一区日韩| 日韩精品a在线观看91| 精品国产欧美日韩一区二区三区| 欧美日韩精品免费观看视频完整| 国产麻豆精品| 1024精品久久久久久久久| 一区二区三区视频免费观看| 老鸭窝一区二区久久精品| 国产日韩欧美| 奶水喷射视频一区| 欧美xxxx中国| 久久九九国产| 欧美日韩精品一本二本三本 | 一区二区三区四区在线看| 亚洲精品小说| 国产精品毛片在线| а√天堂8资源中文在线| 亚洲精品无播放器在线播放| 亚洲最新无码中文字幕久久| 美女久久一区| 99亚洲视频| 欧美日本不卡| 波多视频一区| 午夜视频一区二区在线观看| 国产三级一区| 亚洲小说欧美另类婷婷| 中文一区一区三区免费在线观| 免费不卡在线观看| 国产精品一区二区美女视频免费看 | 久久精品一区二区不卡| 久久午夜精品一区二区| 综合国产视频| 99精品视频在线观看免费播放| 99视频精品| 91欧美在线| 亚洲欧洲日韩精品在线| caoporn视频在线| 蜜臀久久99精品久久久画质超高清 | 欧美偷窥清纯综合图区| 久久国产精品99国产| 自拍自偷一区二区三区| 国产综合色区在线观看| 久久精品影视| 久久麻豆精品| 麻豆国产欧美一区二区三区 | 美女精品在线观看| 久久三级视频| 久久国产精品免费精品3p| 99免费精品| 午夜av成人| 黄色aa久久| 久久精品系列| 亚洲一区欧美二区| 久久成人精品| 日本午夜精品久久久| 久久久精品五月天| 欧美激情福利| 国产精品久久久久久久久久久久久久久| 日韩精品免费一区二区夜夜嗨| 91成人在线| 黄色亚洲精品| 国产综合亚洲精品一区二| 日韩国产精品久久久久久亚洲| 国产精品久久久免费| 天堂久久av| 国产精品亚洲二区| 国产毛片精品| 国内精品美女在线观看| 日韩av一区二区三区| 欧美亚洲tv| 色综合视频一区二区三区日韩| 日本大胆欧美人术艺术动态| 麻豆9191精品国产| 亚洲一区国产一区| 亚洲一区二区毛片| 伊人久久一区| 日本欧美一区二区在线观看| 国产福利片在线观看| 天堂va在线高清一区| yellow在线观看网址| aa国产精品| 亚洲精品亚洲人成在线观看| 亚洲日本久久| 国产视频欧美| 成人在线超碰| 神马日本精品| 久久不见久久见中文字幕免费| 国产精品nxnn| 日韩在线观看一区二区| 在线精品观看| 国产精品毛片久久| 日韩在线一区二区| 国产成人精品一区二区三区免费|