ARC

最近開是作新項目,準備嘗試使用ARC,記錄遇到的一些問題。html

ARC是編譯器特性,因此要求Xcode的最低版本爲4.2,iOS4以上(注意weak是ios4以上纔有的,ios4中只能使用__unsafe_unretained)。ios

ARC的規則:app

  1. 不能調用dealloc方法(能夠重寫,作一些清除操做,例如delegate置空,清除非ARC管理的內存,不能調用[super dealloc],編譯器會自動幫你出入該代碼),不能調用retain,release,autorelease,retainCount。
  2. CFRetain,CFRelease仍正常使用
  3. NSAllocateObject 和 NSDeallocateObject 都不能使用(從沒用過)
  4. 使用alloc建立對象,運行時自動來銷燬對象
  5. C結構體中不能使用對象指針,推薦使用oc對象來代替C結構體
  6. id和void *之間不能隨便的轉換,詳細請見Managing Toll-Free Bridging
  7.  不能使用NSAutoreleasePool,ARC提供autoreleasepool blocks來代替,比NSAutoreleasePool具備更高的效率(Why?)
  8. 不能使用NSZone

注意:ide

  在ARC使用屬性時,不能使用new作前綴(應該是ARC在編譯器階段會爲屬性方法自動添加new作前綴)ui

 ARC新增幾個對象生命週期限定符spa

  1. 屬性 (weak和strong,strong 是默認屬性)
  2. 成員變量(__strong,__weak,__unsafe_unretained,__autoreleasing)

  __strong強引用,系統不會釋放指向強引用的對象,相似retain指針

      __weak弱引用,相似assign,區別是當被引用的對象銷燬時,引用對象會被自動置空code

  __unsafe_unretained與__weak相似,惟一區別是當被引用對象銷燬時,它不會被自動置空,所以可能會成爲野指針htm

  __autoreleasing用來傳遞引用參數,返回時會自動的釋放對象

 

使用編譯器標識激活ARC:-fobjc-arc

禁止ARC:-fno-objc-arc

 

能夠使用下面宏來兼容ARC和非ARC下的屬性聲明

#ifndef MB_STRONG
#if __has_feature(objc_arc)
    #define MB_STRONG strong
#else
    #define MB_STRONG retain
#endif
#endif

#ifndef MB_WEAK
#if __has_feature(objc_arc_weak)
    #define MB_WEAK weak
#elif __has_feature(objc_arc)
    #define MB_WEAK unsafe_unretained
#else
    #define MB_WEAK assign
#endif
#endif
View Code

 

ARC下Block如何使用?

相關文章
相關標籤/搜索