采用現(xiàn)代Objective-C (1)

多年來布持,Objective-C語言已經(jīng)有了革命性的發(fā)展余境。雖然核心理念和實踐保持不變,但語言中的部分內(nèi)容經(jīng)歷了重大的變化和改進』偕現(xiàn)代化的Objective-C在類型安全践磅、內(nèi)存管理、性能灸异、和其他方面都得到了增強府适。使你更容易編寫正確的代碼。在你現(xiàn)有和未來的代碼中使用這些改進是很重要的肺樟,會使你的代碼一致檐春、可讀、靈活么伯。

Xcode提供了一個工具來幫助做這些結(jié)構(gòu)性的變化喇聊。但在使用這個工具之前,你想了解工具為你的代碼做了什么改變以及為什么蹦狂。本文強調(diào)了一些最重要的和有用的現(xiàn)代化方式可以用在你的代碼中誓篱。

instancetype

使用instancetype關(guān)鍵字作為返回類型的方法,該方法返回一個類的實例(或該類的子類)這些方法包括alloc,init,和類工廠方法凯楔。


使用instancetype代替id在適當(dāng)?shù)牡胤娇梢愿纳芆bjective-C代碼類型安全窜骄。例如:考慮下面的代碼:

    @interface MyObject : NSObject
    + (instancetype)factoryMethodA;
    + (id)factoryMethodB;
    @end

    @implementation MyObject
    + (instancetype)factoryMethodA
    {
        return [[[self class] alloc] init];
    }

    + (id)factoryMethodB
    {
        return [[[self class] alloc] init];
    }
    @end

    void doSomething()
    {
        NSUinteger x, y;
        // Return type of +factoryMethodA is taken to be "MyObject *"
        x = [[MyObject factoryMethodA] count];
        // Return type fo +factoryMethodB is "id"
        y = [[MyObject factoryMethodB] count];
    }

因為+factoryMethodA使用了instancetype作為返回類型,該消息的類型
表達式為MyObject *.當(dāng)MyObject沒有-count方法的時候摆屯,編譯器會發(fā)出警告的在x行:

    main.m: 'MyObject' may not respond to 'count'

然而邻遏,由于+factoryMethodB返回類型為id,編譯器不可以給出警告虐骑。因為一個id可以是任何類型的對象類准验,由于存在一個名為-count的方法在一些類中,編譯器可能返回一個+factoryMehtodB的實現(xiàn)的方法廷没。

確保instancetype工廠方法有權(quán)利子類化行為糊饱,在初始化的時候一定要使用[self class]而不是直接引用的類名。遵循這個慣例確保編譯器將正確判斷出子類的類型颠黎。例如:考慮嘗試這樣做一個MyObject的子類從前面的示例:

    @interface MyObjectSubclass : MyObject

    @end

    void doSomethingElse()
    {
        NSString *aString = [MyObjectSubclass factoryMethodA];
    }

關(guān)于這個代碼編譯器將給出下面的警告:

    main.m: Incompatible pointer types initializing 'NSString *'
    with an expression of type 'MyObjectSubclass *'

在這個例子中,+factoryMethodA MyObjectSubclass類型的消息發(fā)送返回一個對象,這是接收者的類型另锋。編譯器確定適當(dāng)?shù)姆祷仡愋?factoryMethodA應(yīng)該是MyObjectSubclass子類,而不是超類的工廠方法被調(diào)用狭归。


怎樣適配

在你的代碼中,出現(xiàn)id作為返回值替換為instancetype在適當(dāng)?shù)牡胤截财骸_@通常是init方法和類的工廠方法。甚至編譯器會自動轉(zhuǎn)以“alloc”过椎、“init”室梅、“new”開頭的方法,而不轉(zhuǎn)換其他的方法。objective-c對instancetype的轉(zhuǎn)換是顯式的方式亡鼠。


請注意,您僅應(yīng)該用instancetype替換id作為返回值,而不是在你的代碼的任何地方都這么做赏殃。不像id,instancetype在聲明方法時僅僅只能作為返回值類型使用拆宛。

    例如:
    @interface MyObject
    - (id)myFactoryMethod;
    @end

    應(yīng)該變?yōu)椋?    @interface MyObject
    - (instancetype)myFactoryMethod;
    @end

或者,您可以在Xcode使用現(xiàn)代objective-c變換器自動進行轉(zhuǎn)換您的代碼嗓奢。更多信息請看使用Xcode重構(gòu)你的代碼讼撒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末浑厚,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子根盒,更是在濱河造成了極大的恐慌钳幅,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炎滞,死亡現(xiàn)場離奇詭異敢艰,居然都是意外死亡,警方通過查閱死者的電腦和手機册赛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門钠导,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人森瘪,你說我怎么就攤上這事牡属。” “怎么了扼睬?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵逮栅,是天一觀的道長。 經(jīng)常有香客問我窗宇,道長措伐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任军俊,我火速辦了婚禮侥加,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘粪躬。我一直安慰自己官硝,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布短蜕。 她就那樣靜靜地躺著唁毒,像睡著了一般琼牧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天搜贤,我揣著相機與錄音肺孵,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛害淤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拓售,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼窥摄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了础淤?” 一聲冷哼從身側(cè)響起崭放,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸽凶,沒想到半個月后币砂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡玻侥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年决摧,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片凑兰。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡掌桩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出姑食,到底是詐尸還是另有隱情波岛,我是刑警寧澤,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布矢门,位于F島的核電站盆色,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祟剔。R本人自食惡果不足惜隔躲,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望物延。 院中可真熱鬧宣旱,春花似錦、人聲如沸叛薯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽耗溜。三九已至组力,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抖拴,已是汗流浹背燎字。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工腥椒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人候衍。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓笼蛛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蛉鹿。 傳聞我的和親對象是個殘疾皇子滨砍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,055評論 2 355

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