《Objective-C高級(jí)編程 iOS與OS X多線程與內(nèi)存管理》5

內(nèi)存管理篇: 5.ARC的規(guī)則補(bǔ)充

  1. ARC的方法命名

我們都知道躬窜,在內(nèi)存管理的思考方式中,當(dāng)方法命名以“alloc炕置、new荣挨、copy、mutableCopy”開(kāi)頭或直接命名時(shí)朴摊,返回對(duì)象(必須返回對(duì)象)的內(nèi)存由接收方進(jìn)行管理垦沉。這種方式在ARC中同樣適用。

在ARC環(huán)境下仍劈,以init或init開(kāi)頭的方法,也需要遵循此規(guī)則寡壮。且init的方法規(guī)定更為嚴(yán)格:

  • 必須返回id或類型的對(duì)象
  • 必須是實(shí)例方法

  1. OC對(duì)象(這里代指Foundation框架中類的對(duì)象)不能直接作為C數(shù)據(jù)結(jié)構(gòu)的成員贩疙。

原因:ARC為OC語(yǔ)言編譯器特性,不支持對(duì)C語(yǔ)言進(jìn)行內(nèi)存管理(最新的iOS 12中况既,好像已經(jīng)支持此特性了这溅,LLVM真強(qiáng)大。棒仍。悲靴。)

對(duì)于需要作為成員的OC對(duì)象,解決方法:

  • 使用“__unsafe_unretained”進(jìn)行所有權(quán)修飾莫其,顯示聲明并告知編譯器不要對(duì)其進(jìn)行內(nèi)存管理癞尚;
  • 通過(guò)“__bridge”將OC對(duì)象轉(zhuǎn)換為(void *)指針耸三。

  1. 顯示轉(zhuǎn)換“id”與“void *”

對(duì)象與C指針之間是通過(guò)“__bridge”關(guān)鍵字進(jìn)行轉(zhuǎn)換,主要分為三種方式:

  • __bridge
  • __bridge_retained
  • __bridge_transfer
  • __bridge:

直接轉(zhuǎn)換浇揩,忽略ARC內(nèi)存管理仪壮,與添加__unsafe_unretained效果類似:

id obj = [[NSObject alloc] init];
// 轉(zhuǎn)換為c指針
void *p = (__bridge void *)obj;
// 轉(zhuǎn)換為OC對(duì)象
id obj2 = (__bridge id)p;
  • __bridge_retained:

意為“轉(zhuǎn)換后進(jìn)行保留”,接收方對(duì)其自動(dòng)強(qiáng)引用(同時(shí)掌握所有權(quán))胳徽,與__strong的retain效果類似:

void *p = 0;
{
    id obj = [[NSObject alloc] init];
    // 轉(zhuǎn)換為c指針
    p = (__bridge_retained void *)obj;
}
// 出作用域后积锅,obj強(qiáng)引用消失
// 由于__bridge_retained,p同時(shí)也是強(qiáng)引用养盗,對(duì)象得以繼續(xù)生存
NSLog("%@", [(__bridge id)p class]);
  • __bridge_transfer:

意為“轉(zhuǎn)換后釋放”缚陷,原創(chuàng)建方在轉(zhuǎn)換后自動(dòng)釋放自身引用,只由接收方進(jìn)行內(nèi)存管理(轉(zhuǎn)換了所有權(quán))往核,與release效果類似:

void *p = xxx;
id obj = (__bridge_transfer id)p;
// 轉(zhuǎn)換后相當(dāng)于p進(jìn)行了release操作箫爷,只有obj持有對(duì)象

OC(Foundation)對(duì)象與CF(Core Foundation)對(duì)象間的轉(zhuǎn)換

  • 由于二者基本是等效框架(只是實(shí)現(xiàn)語(yǔ)言不同),對(duì)象間的轉(zhuǎn)換無(wú)需消耗CPU資源铆铆,是“免費(fèi)橋接”(“toll-free bridge”)蝶缀。
  • 一般轉(zhuǎn)換規(guī)則:
    • OC -> CF,使用“__bridge_retained”或“CFBridgingRetain”
    • CF -> OC薄货,使用“__bridge_transfer”或“CFBridgingRelease”(因?yàn)橐话戕D(zhuǎn)換為OC對(duì)象后翁都,ARC可以自動(dòng)介入,防止忘記使用CFRelease手動(dòng)釋放內(nèi)存)

總結(jié):盡量不要直接使用__bridge進(jìn)行轉(zhuǎn)換谅猾,使用時(shí)需再三考慮內(nèi)存管理情況柄慰。


  1. 使用__strong、__weak和__autoreleasing修飾的變量税娜,其初始值會(huì)自動(dòng)賦值為nil
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末坐搔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子敬矩,更是在濱河造成了極大的恐慌概行,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弧岳,死亡現(xiàn)場(chǎng)離奇詭異凳忙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)禽炬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門涧卵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人腹尖,你說(shuō)我怎么就攤上這事柳恐。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵乐设,是天一觀的道長(zhǎng)讼庇。 經(jīng)常有香客問(wèn)我,道長(zhǎng)伤提,這世上最難降的妖魔是什么巫俺? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮肿男,結(jié)果婚禮上介汹,老公的妹妹穿的比我還像新娘。我一直安慰自己舶沛,他們只是感情好嘹承,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著如庭,像睡著了一般叹卷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坪它,一...
    開(kāi)封第一講書(shū)人閱讀 51,598評(píng)論 1 305
  • 那天骤竹,我揣著相機(jī)與錄音,去河邊找鬼往毡。 笑死蒙揣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的开瞭。 我是一名探鬼主播懒震,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼嗤详!你這毒婦竟也來(lái)了个扰?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤葱色,失蹤者是張志新(化名)和其女友劉穎递宅,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體苍狰,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡办龄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了舞痰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡诀姚,死狀恐怖响牛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤呀打,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布矢赁,位于F島的核電站,受9級(jí)特大地震影響贬丛,放射性物質(zhì)發(fā)生泄漏撩银。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一豺憔、第九天 我趴在偏房一處隱蔽的房頂上張望额获。 院中可真熱鬧,春花似錦恭应、人聲如沸抄邀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)境肾。三九已至,卻和暖如春胆屿,著一層夾襖步出監(jiān)牢的瞬間奥喻,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工非迹, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留环鲤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓彻秆,卻偏偏與公主長(zhǎng)得像楔绞,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子唇兑,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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