instancetype與id

關于instancetype與id

我們寫代碼時候,需要返回某個未知類型的對象經常會選擇用instancetype或id作為返回類型揣非,雖然在一些場合它們可以完成類似的工作,但是它們還是有區(qū)別躲因。

instancetype是clang 3.5開始早敬,clang提供的一個關鍵字忌傻,表示某個方法返回的未知類型的Objective-C對象。

id 是一種通用的對象動態(tài)類型,它可以指向屬于任何類的對象,也可以理解為萬能指針 ,相當于C語言的 void *,id是動態(tài)類型,所以可以通過id類型直接調用指向對象中的方法, 編譯器不會報錯

關聯返回類型

根據Cocoa的命名規(guī)則搞监,滿足下述規(guī)則的方法:
1水孩、類方法中,以alloc或new開頭
2琐驴、實例方法中俘种,以autorelease,init绝淡,retain或self開頭

會返回一個方法所在類類型的對象宙刘,這些方法就被稱為是關聯返回類型的方法。換句話說牢酵,這些方法的返回結果以方法所在的類為類型悬包,說的有點繞口,請看下面的例子:

    NSArray *array = [[NSArray alloc] init];  
//按照Cocoa的命名規(guī)則馍乙,語句[NSArray alloc] 的類型就是NSArray*因為alloc的返回類型屬于關聯返回類型布近。同樣,[[NSArray alloc]init] 的返回結果也是NSArray*丝格。

instancetype和id區(qū)別

當一個非關聯返回類型的方法:
我們用id作為返回類型

    @interface NSArray  
    + (id)constructAnArray;  
    @end  

初始化NSArray

    [NSArray constructAnArray];  

這種情況下我們所得到的對象依然是id類型撑瞧。

我們用instancetype作為返回類型

@interface NSArray  
+ (instancetype)constructAnArray;  
@end  

初始化NSArray

[NSArray constructAnArray]; 

此時我們得到的對象是NSArray類型

instancetype的作用,就是使那些非關聯返回類型的方法返回所在類的類型显蝌!能更好的讓編譯器為我們定位代碼問題

如下代碼:

    [[[NSArray alloc] init] mediaPlaybackAllowsAirPlay]; //  "No visible @interface for `NSArray` declares the selector `mediaPlaybackAllowsAirPlay`"  
      
    [[NSArray array] mediaPlaybackAllowsAirPlay]; // (No error)  

上例中第一行代碼预伺,由于[[NSArray alloc]init]的結果是NSArray*,這樣編譯器就能夠根據返回的數據類型檢測出NSArray是否實現mediaPlaybackAllowsAirPlay方法琅束。有利于開發(fā)者在編譯階段發(fā)現錯誤扭屁。

第二行代碼,由于array不屬于關聯返回類型方法涩禀,[NSArray array]返回的是id類型,編譯器不知道id類型的對象是否實現了mediaPlaybackAllowsAirPlay方法然眼,也就不能夠替開發(fā)者及時發(fā)現錯誤艾船。

總結

instancetype和id的異同
1、相同點
都可以作為方法的返回類型

2高每、不同點
instancetype可以返回和方法所在類相同類型的對象屿岂,id只能返回未知類型的對象;
instancetype只能作為返回值鲸匿,不能像id那樣作為參數爷怀;

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市带欢,隨后出現的幾起案子运授,更是在濱河造成了極大的恐慌烤惊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吁朦,死亡現場離奇詭異柒室,居然都是意外死亡,警方通過查閱死者的電腦和手機逗宜,發(fā)現死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門雄右,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人纺讲,你說我怎么就攤上這事擂仍。” “怎么了熬甚?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵防楷,是天一觀的道長。 經常有香客問我则涯,道長复局,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任粟判,我火速辦了婚禮亿昏,結果婚禮上,老公的妹妹穿的比我還像新娘档礁。我一直安慰自己角钩,他們只是感情好,可當我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布呻澜。 她就那樣靜靜地躺著递礼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪羹幸。 梳的紋絲不亂的頭發(fā)上脊髓,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天,我揣著相機與錄音栅受,去河邊找鬼将硝。 笑死,一個胖子當著我的面吹牛屏镊,可吹牛的內容都是我干的依疼。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼而芥,長吁一口氣:“原來是場噩夢啊……” “哼律罢!你這毒婦竟也來了?” 一聲冷哼從身側響起棍丐,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤误辑,失蹤者是張志新(化名)和其女友劉穎沧踏,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體稀余,經...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡悦冀,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了睛琳。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盒蟆。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖师骗,靈堂內的尸體忽然破棺而出历等,到底是詐尸還是另有隱情,我是刑警寧澤辟癌,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布寒屯,位于F島的核電站,受9級特大地震影響黍少,放射性物質發(fā)生泄漏寡夹。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一厂置、第九天 我趴在偏房一處隱蔽的房頂上張望菩掏。 院中可真熱鬧,春花似錦昵济、人聲如沸智绸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞧栗。三九已至,卻和暖如春海铆,著一層夾襖步出監(jiān)牢的瞬間迹恐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工游添, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留系草,地道東北人。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓唆涝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親唇辨。 傳聞我的和親對象是個殘疾皇子廊酣,可洞房花燭夜當晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內容