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

來源:互聯網
上載者:User

標籤:ext   重複   避免   地址   set   記憶體   initial   reference   text   

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一般用來修飾基礎資料型別 (Elementary Data Type),也可以來修飾對象;
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應該知道的 不定期更新

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.