講講你不知道的 ARC (一)

本文首發(fā)地址:http://www.reibang.com/p/b55513801435

內(nèi)容提要

通過閱讀本篇文章,希望您能了解:如何在 ARC 下孝宗,強制某個變量調(diào)用指定的方法?

前言

首先讓我們先感謝以 Blaine Garst 和 Patrick Beard 為代表的開發(fā)者。他們?yōu)?Objective-C 這門語言添加了眾多特性,而其中最令人喜愛的莫過于 ARC尸红。

相信所有和我一樣經(jīng)歷過手動管理內(nèi)存時代的人,都會對這個特性感到非常的喜愛刹泄。

然而外里,有所得必有所失。本文將會講講 ARC 帶來的一些“麻煩”特石。

一道簡單的面試題

在 MRR 環(huán)境下盅蝗,下面的代碼會?Compile Error / Runtime Crash / NSLog…?

//NSObject+Sun.h
 @interface NSObject (Sun)
 - (void)shining;
 @end

//NSObject+Sun.m
 @implementation NSObject (Sun)
 - (void)shining
 {
    NSLog(@"shining");
 }

 @end
 
//main.m
#import <Foundation/Foundation.h>

 int main(int argc, const char * argv[]) {
  @autoreleasepool {
      [NSObject shining];
}
return 0;
}

答案很簡單姆蘸,雖然會產(chǎn)生一個警告?? Class method '+shining' not found (return type defaults to 'id')墩莫,但是可以正常輸出 shining

對此感到困惑的讀者可以查看拙作 http://www.reibang.com/p/e30977484a66

具體到此問題逞敷,可以查看 @halfrost 的文章 神經(jīng)病院Objective-C Runtime住院第二天—消息發(fā)送與轉(zhuǎn)發(fā)

升級版面試題

剛才的代碼在 ARC 環(huán)境下狂秦,也能正常輸出 shining 嗎?
答案是推捐,不會裂问。它會產(chǎn)生一個編譯錯誤??。錯誤的定義如下所示牛柒。

def err_arc_may_not_respond : Error<
  "no visible @interface for %0 declares the selector %1">;

解決方案也很簡單堪簿。在 main.m 文件中添加一行代碼即可。

#import "NSObject+Sun.h"

問題分析

為什么在 MRR 下面能夠正常運行的代碼皮壁,卻無法在 ARC 下編譯呢椭更?

實際上,在默認(rèn)情況下蛾魄,在 ARC 下面進行編譯時甜孤,編譯器需要知道該方法是如何聲明的协饲,只有這樣畏腕,編譯器才能自動插入相關(guān)的內(nèi)存管理代碼并進行代碼優(yōu)化缴川。

那么,是否可以強制某個變量執(zhí)行指定的方法呢描馅?答案是:有把夸。
可以通過下面主動聲明的方式,告訴編譯器铭污,請執(zhí)行該方法恋日。

[[NSObject new] performSelector:@selector(shining)];
[NSObject performSelector:@selector(shining)];

下期預(yù)告

相信很多人都沒有看明白,為什么在默認(rèn)情況下嘹狞,編譯器需要知道方法是如何聲明的岂膳?

如果你知道原因,歡迎在下方進行評論磅网。

如果你感到好奇谈截,敬請期待下期。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涧偷,一起剝皮案震驚了整個濱河市簸喂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌燎潮,老刑警劉巖喻鳄,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異确封,居然都是意外死亡除呵,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門爪喘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來颜曾,“玉大人,你說我怎么就攤上這事腥放》盒ィ” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵秃症,是天一觀的道長候址。 經(jīng)常有香客問我,道長种柑,這世上最難降的妖魔是什么岗仑? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮聚请,結(jié)果婚禮上荠雕,老公的妹妹穿的比我還像新娘稳其。我一直安慰自己,他們只是感情好炸卑,可當(dāng)我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布既鞠。 她就那樣靜靜地躺著,像睡著了一般盖文。 火紅的嫁衣襯著肌膚如雪嘱蛋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天五续,我揣著相機與錄音洒敏,去河邊找鬼。 笑死疙驾,一個胖子當(dāng)著我的面吹牛凶伙,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播它碎,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼函荣,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了链韭?” 一聲冷哼從身側(cè)響起偏竟,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎敞峭,沒想到半個月后踊谋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡旋讹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年殖蚕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沉迹。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡睦疫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出鞭呕,到底是詐尸還是另有隱情蛤育,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布葫松,位于F島的核電站瓦糕,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏腋么。R本人自食惡果不足惜咕娄,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望珊擂。 院中可真熱鬧圣勒,春花似錦费变、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旁趟,卻和暖如春昼激,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锡搜。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留瞧掺,地道東北人耕餐。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像辟狈,于是被迫代替她去往敵國和親肠缔。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,573評論 2 359

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

  • 內(nèi)存管理是程序在運行時分配內(nèi)存哼转、使用內(nèi)存明未,并在程序完成時釋放內(nèi)存的過程。在Objective-C中壹蔓,也被看作是在眾...
    蹲瓜閱讀 3,101評論 1 8
  • 自動引用計數(shù)(ARC)是一項編譯器功能趟妥,可以給Objective-C提供自動內(nèi)存管理的能力。ARC使得程序員能專注...
    hlwz5735閱讀 1,605評論 0 3
  • 你曾出現(xiàn)過佣蓉,在不經(jīng)意間披摄。 我的意識里,所有的一切皆真實 你就在那里勇凭,我就在那里 或者說 我們曾一同去往那處 已經(jīng)這...
    念王不往閱讀 188評論 1 1
  • 了了無諍閱讀 279評論 0 1
  • 繼續(xù)行走在路上虾标,昨晚抵達九寨溝溝口寓盗,今日上午要去游玩九寨溝了,希望能邂逅美麗風(fēng)景璧函,多拍些美美噠照片傀蚌,作業(yè)堆積了一部...
    鉆石的閃耀閱讀 148評論 0 0