ARC機制基本規則:
delegate使用方法:@property (assign) <id>xxxDelegate delegate;
delegate和outlet 應該用 weak 屬性來聲明
在ARC機制下,徹底忘掉retain、release、retainCount和autorelease。以前我們在需要安全使用一個對象時,往往會將該對象retain住,在不需要的時候進行release。在ARC環境下這麼做會有編譯錯誤。
在@property聲明中,用strong和weak代替相應的retain, copy,和assign。
int, BOOL用assign修飾
__weak 定義的變量一致,該屬性所聲明的變量將沒有對象的所有權,並且當對象被破棄之後,對象將被自動賦值nil
使用ARC的一些強制規定:
- 不能直接調用dealloc方法,不能調用retain,release,autorelease,retainCount方法,包括@selector(retain)的方式也不行
- 可以用dealloc方法來管理一些資源,但不能用來釋放實例變量,也不能在dealloc方法裏面去掉[super dealloc]方法,在ARC下父類的dealloc同樣由編譯器來自動完成
- Core Foundation類型的對象仍然可以用CFRetain,CFRelease這些方法
- 不能再使用NSAllocateObject和NSDeallocateObject對象
- 不能在C結構體中使用對象指針,如果由類似功能可以創建一個Objective-C類來管理這些對象
- 在id和void*之間沒有簡便的轉換方法,同樣在Objective-C和core Foundation類型之間的轉換都需要使用編譯器制定的轉換函數
- 不能再使用NSAutoreleasePool對象,ARC提供了@autoreleasepool塊來代替它,這樣更有效率
- 不能使用內存存儲區(不能再使用NSZone)
- 不能以new爲開頭給一個屬性命名
- 聲明outlet時一般應當使用weak,除了對StoryBoard這樣nib中間的頂層對象要用strong
- weak相當於老版本的assign,strong相當於retain
老版本的工程是可以轉換成使用ARC的工程的,轉換規則包括:
- 去掉所有的retain,release,autorelease
- 把NSAutoRelease替換成@autoreleasepool{}塊
- 把assign的屬性變爲weak
dealloc方法的使用:
- 已經開啓了arc,dealloc還可以使用,只是在代碼中中不能顯示調用,在dealloc方法中不可以包含[super dealloc]。
- 在dealloc中一般用來解除delegate,例如self.webView.delegate = nil;
- 開始的時候註冊了notification等,那麼是需要在dealloc中把這些notification移除掉
- 如果某個類沒有調用dealloc方法,會導致內存泄露,這時要檢查在該類內部是否有其他對象調用了該對象導致無法成功釋放。