1. 程式人生 > >作為一個iOSCoder應該知道的 不定期更新

作為一個iOSCoder應該知道的 不定期更新

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]];
        }
    }



2.
關於assign和weak
__block vs __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應該知道的 不定期更新