小生第二次回顧這本書涵亏,上次還是兩個月前才看完,記錄于此蒲凶,望兄去疑气筋。
1、蘋果和GNUstep內(nèi)存管理區(qū)別
兩者都通過引用計數(shù)來管理內(nèi)存旋圆,但存儲引用計數(shù)的方式有所不同宠默。
蘋果:大概通過散列表(引用計數(shù)表)來管理引用計數(shù),表鍵值為內(nèi)存塊地址的散列值 引用計數(shù)---內(nèi)存塊地址灵巧。引用計數(shù)表各個記錄中存有內(nèi)存塊搀矫,可以通過每條記錄找到個對象的內(nèi)存塊。
GNUstep:引用計數(shù)直接保存在對象所占用內(nèi)存塊頭部的變量中刻肄。```
2艾君、藏著的autorelease和__strong
通過alloc、new肄方、copy冰垄、mutableCopy開頭的方法生成的對象只有自己持有,像咱們平時arrayWith权她、stringWith虹茶、[NSMutableDictionary dictionary]、等類方法生成的對象是不能持有該對象如
id object = [NSMutableArray array];
object是不能持有NSMutableArray生成的對象隅要,但是為啥咱們在開發(fā)的時候還是可以正常使用object這個對象呢蝴罪,其實系統(tǒng)默認(rèn)給這個對象又加了一個方法 ? [object autorelease]方法,同時object對象默認(rèn)用__strong修飾步清,強(qiáng)引用非自己生成的對象要门,通過該方法使取得對象存在。當(dāng)object對象超出最近的NSAutoreleasePool作用域時廓啊,object對象被release釋放欢搜,同時NSMutableArray對象也會被釋放。
莽夫今天忘帶電腦回家家谴轮,全用手機(jī)敲打炒瘟。
3、__strong第步、__weak疮装、__unsafe_unretained缘琅、__autoreleasing區(qū)別
id和對象類型在沒有明確指定所有權(quán)修飾時,默認(rèn)為__strong修飾符 ? ? ? ? ? ? ? ? ?
id object = [[NSObject alloc] init];?
?<==> id __strong object = [[NSObject alloc] init];表示object對象對NSObject這個類對象的強(qiáng)引用廓推。當(dāng)兩個或者多個__strong修飾的對象相互引用時會導(dǎo)致循環(huán)引用刷袍,內(nèi)存不能回收造成內(nèi)存泄漏、程序可能導(dǎo)致崩潰樊展。
對自身的強(qiáng)引用 ? ? ? :id object = [[Text alloc] init]; ?[object setObject:object];
類成員變量循環(huán)引用:id obj0 = [[Text alloc] init]; ? id obj1 = [[Text alloc] init];
[obj0 setObject:obj1]; ?[obj1 setObject:obj0];
__weak和__unsafe_unretained都能解決循環(huán)引用的問題呻纹。不同之處在于如下圖。滚局。居暖。
在ARC有效時用 @autoreleasepool快代替NSAutoreleasepool類,用附有__autoreleasing修飾變量來代替autorelease方法藤肢。
當(dāng)有返回值時太闺,由于return使得對象變量超出其作用域,編譯器會自動將其注冊到autoreleasepool中嘁圈。
在訪問附有__weak修飾的變量時省骂,實際上必定要訪問到注冊到autoreleasepool的對象,__weak修飾變量只對對象持弱引用最住,在訪問引用對象的過程中钞澳,該對象有可能被廢棄,如果把要訪問的對象注冊到autoreleasepool中涨缚,那么在autoreleasepool塊結(jié)束之前都能確保該對象存在轧粟。