自動引用計數(shù)(ARC)學(xué)習(xí)筆記

環(huán)境

  • Xcode Version 8.0 (8A218a)
  • Objective-C

回顧MRC內(nèi)存管理的黃金法則

  1. 自己生成的對象突硝,自己持有 (alloc , new ,copy, mutalbleCopy )
  2. 不是自己生成的對象柑贞,也可以持有 (retain)
  3. 自己持有的對象不再需要時釋放 (release)
  4. 非自己持有的對象不能釋放

對整個項目設(shè)置是否使用ARC

PROJECT -> Build settings -> Apple LLVM 8.0 - Language - Objective C -> Objective-C Automatic Reference Counting 設(shè)置YES或者NO來開啟或者關(guān)閉ARC

對項目里的單個或部分源文件設(shè)置是否使用ARC

PROJECT -> Build Phases -> Compile Sources 選中(可多選)需要設(shè)置的源文件业岁,設(shè)置右側(cè)的Compiler Flag

  • 用-fno-objc-arc標(biāo)記來禁用在ARC工程那些不支持ARC的文件的ARC
  • 用-fobjc-arc標(biāo)記啟用非ARC工程中支持ARC的文件

SDK中ARC相關(guān)的宏定義,類和方法

// Marks methods and functions which cannot be used when compiling in automatic reference counting mode.
#if __has_feature(objc_arc)
#define NS_AUTOMATED_REFCOUNT_UNAVAILABLE __attribute__((unavailable("not available in automatic reference counting mode")))
#else
#define NS_AUTOMATED_REFCOUNT_UNAVAILABLE
#endif
/* OBJC_ARC_UNAVAILABLE: unavailable with -fobjc-arc */
#if !defined(OBJC_ARC_UNAVAILABLE)
#   if __has_feature(objc_arc)
#       define OBJC_ARC_UNAVAILABLE OBJC_UNAVAILABLE("not available in automatic reference counting mode")
#   else
#       define OBJC_ARC_UNAVAILABLE
#   endif
#endif
/***********    Object Allocation / Deallocation        *******/
    
FOUNDATION_EXPORT id NSAllocateObject(Class aClass, NSUInteger extraBytes, NSZone * _Nullable zone) NS_AUTOMATED_REFCOUNT_UNAVAILABLE;

FOUNDATION_EXPORT void NSDeallocateObject(id object) NS_AUTOMATED_REFCOUNT_UNAVAILABLE;

FOUNDATION_EXPORT id NSCopyObject(id object, NSUInteger extraBytes, NSZone * _Nullable zone) NS_AUTOMATED_REFCOUNT_UNAVAILABLE NS_DEPRECATED(10_0, 10_8, 2_0, 6_0);

FOUNDATION_EXPORT BOOL NSShouldRetainWithZone(id anObject, NSZone * _Nullable requestedZone) NS_AUTOMATED_REFCOUNT_UNAVAILABLE;

FOUNDATION_EXPORT void NSIncrementExtraRefCount(id object) NS_AUTOMATED_REFCOUNT_UNAVAILABLE;

FOUNDATION_EXPORT BOOL NSDecrementExtraRefCountWasZero(id object) NS_AUTOMATED_REFCOUNT_UNAVAILABLE;

FOUNDATION_EXPORT NSUInteger NSExtraRefCount(id object) NS_AUTOMATED_REFCOUNT_UNAVAILABLE;
NS_AUTOMATED_REFCOUNT_UNAVAILABLE
@interface NSAutoreleasePool : NSObject
@autoreleasepool {
     // Code, such as a loop that creates a large number of temporary objects.
}
@protocol NSObject
- (instancetype)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;

- (struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;
@interface NSObject <NSObject>
+ (id)copyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;
+ (id)mutableCopyWithZone:(struct _NSZone *)zone OBJC_ARC_UNAVAILABLE;

ARC中的修飾符

  • __strong
    1. __strong修飾符是id類型和對象類型默認的所有權(quán)修飾符粟焊。
    2. 持有強引用的變量在超出其作用域時被廢棄台诗,隨著強引用的失效愤兵,引用的對象會隨之釋放热凹。
    3. 無法解決 循環(huán)引用泵喘,會造成內(nèi)存泄漏,既應(yīng)當(dāng)廢棄的對象在超出其生存周期后繼續(xù)存在般妙。
  • __weak
    1. 弱引用纪铺,不能持有對象實例。
    2. 當(dāng)弱引用的對象被廢棄碟渺,則此弱引用將自動失效且處于nil被賦值的狀態(tài)(空弱引用)鲜锚。通過檢查附有__weak修飾符的變量是否為nil,可以判斷被賦值的對象是否被廢棄苫拍。
    3. 適用于iOS5以上版本芜繁,在iOS4中可以使用__unsafe_unretained修飾符代替苇倡。
  • __unsafe_unretained
    1. 修飾符的變量不屬于編譯器的內(nèi)存管理對象合溺,是不安全的所有權(quán)修飾符。既不持有對象的強引用厉亏,又不持有對象的弱引用垄提。
  • __autoreleasing
    1. ARC有效榔袋,且要使用autorelease時,可以通過將對象賦值給附加了__autoreleasing修飾符的變量铡俐。
    2. 主要在 @autoreleasepool{ } 代碼塊中使用凰兑。
    其中 strong,weak,autoreleasing 修飾符可以保證附有這些修飾符的自動變量初始化為nil。

屬性@property中對應(yīng)的修飾符

屬性 修飾符
assign __unsafe_unretained
copy __strong (復(fù)制對象)
retain __strong
strong __strong
__unsafe_unretained __unsafe_unretained
weak __weak

注意事項

  1. retain审丘,release吏够, autorelease,retainCount 禁用滩报,@selector(release) 也不可以锅知。編譯器自動生成合適的dealloc,不能手動調(diào)用露泊, 不能調(diào)用[super dealloc]喉镰。
  2. 屬性訪問器不能以new開頭。
// Won't work:
@property NSString *newTitle;
  1. 在 ARC模式下惭笑,__strong是對象類型默認的修飾符侣姆。
  2. 再沒有必要使用NSZone,他們已經(jīng)被現(xiàn)代Objective-C runtime忽略沉噩。
  3. IBOutlet選擇修飾符捺宗,如果該控件位于控件樹的頂部,比如 UIViewController下的view川蒙,那就應(yīng)該選擇strong蚜厉;而如果控件是viewcontroller中view的子視圖使用weak。
  4. id類型和泛型指針void * 的轉(zhuǎn)換畜眨。 1 . 修飾符 _bridge 安全性與賦值給 _unsafe_unretained 修飾符相近昼牛,甚至更低术瓮,管理不當(dāng),可能會因懸垂指針導(dǎo)致崩潰贰健。2 . 修飾符 _bridge_retained 可以使要轉(zhuǎn)換賦值的變量也持有所賦值的對象胞四。3 . __bridge_transfer 被轉(zhuǎn)換的變量所持有的對象在該變量被賦值給轉(zhuǎn)換目標(biāo)變量后隨之釋放。
void * p = 0;
id obj = [[NSObject alloc] init];
void * p = (__bridge_retained void *)obj;
id obj = (__bridge_transfer id)p;

參考和引用

Transitioning to ARC Release Notes
MBProgressHUD

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末伶椿,一起剝皮案震驚了整個濱河市辜伟,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脊另,老刑警劉巖导狡,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異偎痛,居然都是意外死亡旱捧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門看彼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來廊佩,“玉大人,你說我怎么就攤上這事靖榕”瓿” “怎么了?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵茁计,是天一觀的道長料皇。 經(jīng)常有香客問我,道長星压,這世上最難降的妖魔是什么践剂? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮娜膘,結(jié)果婚禮上逊脯,老公的妹妹穿的比我還像新娘。我一直安慰自己竣贪,他們只是感情好军洼,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著演怎,像睡著了一般匕争。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上爷耀,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天甘桑,我揣著相機與錄音,去河邊找鬼。 笑死跑杭,一個胖子當(dāng)著我的面吹牛铆帽,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播艘蹋,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼锄贼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了女阀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤屑迂,失蹤者是張志新(化名)和其女友劉穎浸策,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惹盼,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡庸汗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了手报。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚯舱。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掩蛤,靈堂內(nèi)的尸體忽然破棺而出枉昏,到底是詐尸還是另有隱情,我是刑警寧澤揍鸟,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布兄裂,位于F島的核電站,受9級特大地震影響阳藻,放射性物質(zhì)發(fā)生泄漏晰奖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一腥泥、第九天 我趴在偏房一處隱蔽的房頂上張望匾南。 院中可真熱鬧,春花似錦蛔外、人聲如沸蛆楞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽臊岸。三九已至,卻和暖如春尊流,著一層夾襖步出監(jiān)牢的瞬間帅戒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逻住,地道東北人钟哥。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像瞎访,于是被迫代替她去往敵國和親腻贰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容