作為一個iOSCoder應該知道的 不定期更新
阿新 • • 發佈:2017-12-18
ssi 基本 類方法 循環 手動內存管理 auto 目前 bject ron
1. what is ARC ?
ARC: automatic reference counting自動引用計數。
簡單點說就是系統在適當的地方自動給對象加減引用計數,當retain count == 0 時 銷毀;
那麽ARC是為了解決什麽問題誕生的呢?這個得追溯到MRC手動內存管理時代說起。 (從知乎上看到,個人感覺知識MRC比較繁瑣,又容易比較出錯,感覺下面答案還是知道的太淺)
MRC下內存管理的缺點:
1.當我們要釋放一個堆內存時,首先要確定指向這個堆空間的指針都被release了。(避免提前釋放)
2.釋放指針指向的堆空間,首先要確定哪些指針指向同一個堆,這些指針只能釋放一次。(MRC下即誰創建,誰釋放,避免重復釋放)
3.模塊化操作時,對象可能被多個模塊創建和使用,不能確定最後由誰去釋放。
4.多線程操作時,不確定哪個線程最後使用完畢。
另外關於ARC的autoreleasepool
程序中加入autoreleasepool的對象會由系統自動加上autorelease方法,如果該對象引用計數為0,則銷毀。
autoreleasepool一般在位置長度的循環中使用,目前項目中還沒有用到.
曾經在YYCache中看到這麽一句:
@autoreleasepool { for (int i = 0; i < count; i++) { [pin setObject:values[i] forKey:keys[i]]; } }
__block vs __weak
2. 關於assign和weak
assign一般用來修飾基本數據類型,也可以來修飾對象;
weak一般用來修飾對象;
assign可以用來修飾對象,那麽我們為什麽不用它呢?因為被assign修飾的對象在釋放之後,指針的地址還是存在的,也就是說指針並沒有被置為nil。如果在後續的內存分配中,剛好分到了這塊地址,程序就會崩潰掉。
而weak修飾的對象在釋放之後,指針地址會被置為nil。所以現在一般弱引用就是用weak。
首先__block是用來修飾一個變量,這個變量就可以在block中被修改
__block:使用__block修飾的變量在block代碼快中會被retain(ARC下,MRC下不會retain)
__weak:使用__weak修飾的變量不會在block代碼塊中被retain
同時,在ARC下,要避免block出現循環引用 __weak typedof(self)weakSelf = self;
3.+(void)load; +(void)initialize;有什麽用處?
在Objective-C中,runtime會自動調用每個類的兩個方法。+load會在類初始加載時調用,+initialize會在第一次調用類的類方法或實例方法之前被調用。這兩個方法是可選的,且只有在實現了它們時才會被調用。
共同點:兩個方法都只會被調用一次。可以把一次性設置的東西卸寫在這兩個方法中;
作為一個iOSCoder應該知道的 不定期更新