關于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那樣作為參數爷怀;