一、概述
instancetype是clang 3.5開始提供的一個關(guān)鍵字,與id一樣表示某個方法返回的未知類型的Objective-C對象。但是instancetype和id區(qū)別到底有什么區(qū)別呢?
二、關(guān)聯(lián)返回類型和非關(guān)聯(lián)返回類型
要搞懂id 和instancetype的異同 首先要弄懂iOS中兩個概念:關(guān)聯(lián)返回類型和非關(guān)聯(lián)返回類型。
1、關(guān)聯(lián)返回類型
根據(jù)Cocoa的命名規(guī)則,滿足下述規(guī)則的方法:
(1)類方法中,以alloc或new開頭
(2)實例方法中,以autorelease,init,retain或self開頭
會返回一個方法所在類類型的對象,這些方法就被稱為是關(guān)聯(lián)返回類型的方法。換句話說,這些方法的返回結(jié)果以方法所在的類為類型。
如下:
@interface NSObject?
+ (id)alloc;?
- (id)init;?
@end
當我們使用如下方式初始化NSArray時:
NSArray *array = [[NSArray alloc] init];
按照Cocoa的命名規(guī)則,[NSArray alloc]與[[NSArray alloc]init]返回的都為NSArray的對象。
2、非關(guān)聯(lián)返回類型
@interface NSArray?
+ (id)constructAnArray;?
@end
當我們使用如下方式初始化NSArray時:
[NSArray constructAnArray];
根據(jù)Cocoa的方法命名規(guī)范,得到的返回類型就和方法聲明的返回類型一樣,是id。
但是如果使用instancetype作為返回類型,如下:
@interface NSArray?
+ (instancetype)constructAnArray;?
@end
當使用相同方式初始化NSArray時:
[NSArray constructAnArray];
得到的返回類型和方法所在類的類型相同,是NSArray*!
總結(jié)一下,instancetype的作用,就是使那些非關(guān)聯(lián)返回類型的方法返回所在類的類型!
三、instancetype和id區(qū)別
(1)id在編譯的時候不能判斷對象的真實類型
instancetype在編譯的時候可以判斷對象的真實類型
(2)如果init方法的返回值是instancetype,那么將返回值賦值給一個其它的對象會報一個警告
如果是在以前, init的返回值是id,那么將init返回的對象地址賦值給其它對象是不會報錯的
(3)id可以用來定義變量, 可以作為返回值, 可以作為形參
instancetype只能用于作為返回值,例如:
//err,expected a type?
- (void)setValue:(instancetype)value?
{?
? ? //do something?
}?
就是錯的,應(yīng)該寫成:
- (void)setValue:(id)value?
{?
? ? //do something?
}
注意:以后但凡自定義構(gòu)造方法, 返回值盡量使用instancetype, 不要使用id
原文鏈接:https://link.juejin.im/?target=http%3A%2F%2Fwww.imlifengfeng.com%2Fblog%2F%3Fp%3D485