首先,說明ARC:自動參考計數。
幾個弧點:
創建對象時的保留計數+1,釋放對象時的保留計數-1。當保留計數為0時,對象被銷毀。
Autorelease方法將自動添加到程序中添加了autoreleasepool的對象中。如果對象的引用計數為0,它將被銷毀。
那麽ARC的誕生是為了解決什麽問題呢?這要追溯到MRC手動內存管理的時代。
MRC下內存管理的缺點:
1.當我們想要釋放壹個堆內存時,我們必須首先確保指向這個堆空間的指針已經被釋放。(避免提前發布)
2.要釋放指針所指向的堆空間,首先要確定哪些指針指向同壹個堆,這些指針只能釋放壹次。(MRC下,誰創建誰發布,避免重復發布。)
3.在模塊化操作中,對象可能被多個模塊創建和使用,最終由誰來釋放是不確定的。
4.多線程的時候,最後哪個線程會用完是不確定的。
2.請解釋以下關鍵詞的區別:賦值vs弱,_ _塊vs _ _弱。
Assign適用於基本數據類型,weak適用於NSObject對象,它是壹個弱引用。
第_ _塊用於修改壹個變量,這個變量可以在塊中修改(參考塊實現原理)。
__block:用__block修飾的變量將被保留(塊代碼express中的ARC(在ARC下,不在MRC下))。
__weak:用__weak修飾的變量不會保留在塊代碼塊中。
同時,在ARC下,需要避免(self) WeakSelf = self的block _ _ WeakTyped的循環引用;
3._ _ block在圓弧和非圓弧下的意思壹樣嗎?
不壹樣。
在MRC中,__block變量在塊中使用時不會被保留。
但是弧中_ _塊將被保留。
而是使用__weak或__unsafe_unretained來更準確地描述弱引用的用途。
前者只能在iOS5之後使用,但是更好(對象釋放後,這個指針會自動設置為nil)。
後者是在ARC環境下兼容4.x的解決方案。
所以在上面的例子中,
_ _ block my class * temp =…;//在MRC環境中使用__weak MyClass* temp = …;// ARC但只支持iOS5.0以上版本_ _ unsafe _ retained my class * temp =…;//ARC並且可以兼容4.x以後的版本。
4.使用非原子是線程安全的嗎?()
不是這樣的。
原子的原子操作,系統會鎖定setter方法。使用@synchronized(self){//code}
Nonatomic不會鎖定setter方法。
Atomic:線程安全,需要消耗大量系統資源來鎖定屬性。
非原子:非線程安全,適用於內存小的移動設備。
5.描述壹個您遇到的保留周期的例子。
塊中的循環引用:viewController
@property (nonatomic,strong)http request handler * handler;@property(非原子,強)NSData * data_ handler =[http request handler shared manager];[downloaddata:^(id response data]{ _ data = response data;}];
Self擁有_handler,_handler擁有block,block擁有self(由於使用了self的_data屬性,所以block會復制self的壹個副本)。
解決方案:
_ _弱類型of(self)weak self = self[downloaddata:^(id response data]{ weak self . data = response data;}];
6.+(空)荷載;+(void)初始化;有什麽用?
在Objective-C中,運行時自動調用每個類的兩個方法。初始加載類時會調用+load,第壹次調用類的類方法或實例方法前會調用+initialize。這兩個方法是可選的,只有在實現時才會被調用。
* * *相同點:兩種方法都只會調用壹次。