iOS開發(fā)ARC內(nèi)存管理技術(shù)要點(diǎn)
strong,weak 用來修飾屬性。
strong 用來修飾強(qiáng)引用的屬性;
@property (strong) SomeClass * aObject; 對(duì)應(yīng)原來的
@property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject;
weak 用來修飾弱引用的屬性;
@property (weak) SomeClass * aObject; 對(duì)應(yīng)原來的
@property (assign) SomeClass * aObject;
__weak, __strong , __unsafe_unretained, __autoreleasing 都是用來修飾變量的。
__strong 是缺省的關(guān)鍵詞。
__weak 聲明了一個(gè)可以自動(dòng) nil 化的弱引用。
__unsafe_unretained 聲明一個(gè)弱應(yīng)用,但是不會(huì)自動(dòng)nil化,也就是說,如果所指向的內(nèi)存區(qū)域被釋放了,這個(gè)指針就是一個(gè)野指針了。
__autoreleasing在ARC中主要用在參數(shù)傳遞返回值(out-parameters)和引用傳遞參數(shù)(pass-by-reference)的情況下。詳見
為什么我們?nèi)砸褂胈_unsafe_unretain呢?這是因?yàn)開_weak直到iOS5.0以及l(fā)ion之后才出現(xiàn)。
而__autoreleasing 的英文解釋為:to denote arguments that are passed by reference (id *) and are autoreleased on return,即主要是在引用傳參時(shí)使用。
最后需要注意的一點(diǎn)是:cocoa設(shè)定了一個(gè)規(guī)則,即父對(duì)象建立子對(duì)象的強(qiáng)引用,而子對(duì)象只對(duì)父對(duì)象建立弱引用。
而使用弱引用時(shí)需要注意,當(dāng)你發(fā)消息給一個(gè)被dealloc的弱引用對(duì)象時(shí),你的程序會(huì)崩毀。因此,必須細(xì)致地判斷對(duì)象是否有效。多數(shù)情況下,被弱引用地對(duì)象是知道其他對(duì)象對(duì)它的弱引用的,所以當(dāng)它自己dealloc時(shí),需要通知對(duì)它弱引用的其他對(duì)象。