內存管理與自動引用 — 第三日

1.3 ARC規(guī)則

1.3.1 概要

實際上“引用計數(shù)式內存管理”的本質部分在ARC中并沒有改變润脸。就像“自動引用計數(shù)”這個名稱表示的那樣,幫我們自動處理“引用計數(shù)”的相關部分。

1.3.2 內存管理的思考方式

和之前的章節(jié)所描述一樣

- 自己生成的對象耐量,自己持有

- 非自己生成的對象,也能持有

- 自己持有的對象不再需要時釋放

- 非自己持有的對象無法釋放

1.3.3 所有權修飾符

一共四種

- __strong 修飾符

- __weak 修飾符

- __unsafe_unretained 修飾符

- __autoreleasing 修飾符

__strong 修飾符

__strong 修飾符是 id 類型和對象默認的所有權修飾符。

__strong 修飾符表示對對象的“強引用”扫尺,修飾的對象在超出其作用域后自動釋放其持有的對象。

__strong 所修飾的變量可以相互賦值

循環(huán)引用:兩個__strong修飾的變量互相持有炊汤,引發(fā)內存泄漏

內存泄漏:超出作用域的對象無法廢棄正驻,繼續(xù)存在

__weak 修飾符

__weak 修飾符修飾的變量只獲取對象的弱引用,不持有對象

id __weak obj0 = [[NSObject alloc] init];

是不對的抢腐。姑曙。。

正確的寫法

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

id __weak obj1 = obj0;

原因是 alloc 生成的對象默認是自己持有迈倍,而__weak修飾符則表示只獲取對象的引用而不持有伤靠,所以生成的對象會被立即釋放。

__unsafe_unretained修飾符

id __weak obj0= nil;

id __unsafe_unretained obj1= nil;

{

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

obj0 = obj2;

obj1 = obj2;

NSLog(@“obj0: %@, obj1: %@”, obj0, obj1)

} /*

*obj2作用域結束啼染,強引用失效宴合,自動釋放對象

*此時重復輸出obj2所引用對象的地址

*/

NSLog(@“obj0: %@, obj1: %@”, obj0, obj1)

/*

*此時會輸出 nil和obj2引用的對象

*

*此時的obj2早已廢棄,所以obj1是懸垂指針迹鹅,會導致錯誤訪問導致崩潰

*/

然而卦洽,在iOS4之前,必須使用 __unsafe_unretained 來扮演 __weak 修飾符的角色斜棚。然而上述代碼出現(xiàn)的問題告訴我們阀蒂,在使用 __unsafe_unretained 修飾符時该窗,賦值給 __strong 修飾的變量時一定要確認被賦值的對象確實存在!

__autoreleasing 修飾符

在ARC有效時把對象賦值給 __autoreleasing 修飾的對象時蚤霞,相當于在 ARC 無效時對象調用 autorelease 方法酗失,即將對象注冊到 autoreleasepool 。

編譯器會檢查方法名是否以 alloc/new/copy/mutableCopy 開始昧绣,如果不是則自動將返回值的對象注冊到 autoreleaspool 规肴。init 方法的返回值的對象不注冊到 autoreleasepool 。

同時如果變量搶引用對象作為返回值時夜畴,作用域結束時該強引用所持有的對象將會自動釋放奏纪,但是作為返回值不會廢棄,而是自動注冊到 autoreleasepool 斩启。

__weak 修飾的變量序调,實際上必定要訪問注冊到 autoreleasepool的對象。

id __weak obj1 = obj0;

NSLog(@“class = %@”, [obj1 class]);

此源碼等價于

id? __weak obj1 = obj0;

id? __autoreleasing temp = obj1;

NSLog(@“class = %@”, [temp class]);

這是因為 __weak 修飾的變量只獲取對象的弱引用而不持有對象兔簇,為了確保在調用的時候對象不被廢棄发绢,使用 __autoreleasing 修飾符將對象注冊到 autoreleasepool 中。因此每次我們用 __weak 修飾符時一定會用到 autoreleasepool 中的對象垄琐。

至于對象指針默認用 __autoreleasign 修飾边酒。。狸窘。恕我愚鈍墩朦,些許弄不懂。我打開xCode實驗了下

- (void)makeAnError:(NSError *)error {

error = [[NSError alloc] init];

}

- (void)makeAnError:(NSError **)error {

*error = [[NSError alloc] init];

}

創(chuàng)建一個NSError類型的變量翻擒,指向nil氓涣,將其分別傳入兩個方法后,前者 error = 0x00,后者會有值陋气。我的問題是劳吠,在這兩個方法里創(chuàng)建出來的 error 對象注冊到 pool 里,那么此 pool 到底是哪個 pool巩趁,這個 pool 什么時候 drain痒玩,或者說在程序運行中這個 pool 的范圍到底什么多大 。為什么在 這個 error 的作用域外议慰,別的變量也可以持有蠢古。此坑待填。假如有懂的可以留言解釋下别凹,多謝草讶。

NSRunloop無論在ARC有效還是無效時都可以釋放注冊到 autoreleasepool 中的對象

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市番川,隨后出現(xiàn)的幾起案子到涂,更是在濱河造成了極大的恐慌,老刑警劉巖颁督,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件践啄,死亡現(xiàn)場離奇詭異,居然都是意外死亡沉御,警方通過查閱死者的電腦和手機屿讽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來吠裆,“玉大人伐谈,你說我怎么就攤上這事∈愿恚” “怎么了诵棵?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長祝旷。 經(jīng)常有香客問我履澳,道長,這世上最難降的妖魔是什么怀跛? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任距贷,我火速辦了婚禮,結果婚禮上吻谋,老公的妹妹穿的比我還像新娘忠蝗。我一直安慰自己,他們只是感情好漓拾,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布阁最。 她就那樣靜靜地躺著,像睡著了一般骇两。 火紅的嫁衣襯著肌膚如雪闽撤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天脯颜,我揣著相機與錄音哟旗,去河邊找鬼。 笑死栋操,一個胖子當著我的面吹牛闸餐,可吹牛的內容都是我干的。 我是一名探鬼主播矾芙,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼舍沙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了剔宪?” 一聲冷哼從身側響起拂铡,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤壹无,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后感帅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斗锭,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年失球,在試婚紗的時候發(fā)現(xiàn)自己被綠了岖是。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡实苞,死狀恐怖豺撑,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情黔牵,我是刑警寧澤聪轿,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站猾浦,受9級特大地震影響屹电,放射性物質發(fā)生泄漏。R本人自食惡果不足惜跃巡,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一危号、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧素邪,春花似錦外莲、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沽甥,卻和暖如春声邦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摆舟。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工亥曹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人恨诱。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓媳瞪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親照宝。 傳聞我的和親對象是個殘疾皇子蛇受,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內容