一光督、概述
instancetype是clang 3.5開始提供的一個(gè)關(guān)鍵字,與id一樣表示某個(gè)方法返回的未知類型的Objective-C對象。但是instancetype和id區(qū)別到底有什么區(qū)別呢?
二橄仆、關(guān)聯(lián)返回類型和非關(guān)聯(lián)返回類型
要搞懂id 和instancetype的異同 首先要弄懂iOS中兩個(gè)概念:關(guān)聯(lián)返回類型和非關(guān)聯(lián)返回類型。
1衅斩、關(guān)聯(lián)返回類型
根據(jù)Cocoa的命名規(guī)則盆顾,滿足下述規(guī)則的方法:
(1)類方法中,以alloc或new開頭
(2)實(shí)例方法中畏梆,以autorelease您宪,init,retain或self開頭
會返回一個(gè)方法所在類類型的對象奠涌,這些方法就被稱為是關(guān)聯(lián)返回類型的方法蚕涤。換句話說,這些方法的返回結(jié)果以方法所在的類為類型铣猩。
如下:
@interface NSObject?
+ (id)alloc;?
- (id)init;?
@end
當(dāng)我們使用如下方式初始化NSArray時(shí):
NSArray *array = [[NSArray alloc] init];
按照Cocoa的命名規(guī)則,[NSArray alloc]與[[NSArray alloc]init]返回的都為NSArray的對象茴丰。
2达皿、非關(guān)聯(lián)返回類型
@interface NSArray?
+ (id)constructAnArray;?
@end
當(dāng)我們使用如下方式初始化NSArray時(shí):
[NSArray constructAnArray];
根據(jù)Cocoa的方法命名規(guī)范,得到的返回類型就和方法聲明的返回類型一樣贿肩,是id峦椰。
但是如果使用instancetype作為返回類型,如下:
@interface NSArray?
+ (instancetype)constructAnArray;?
@end
當(dāng)使用相同方式初始化NSArray時(shí):
[NSArray constructAnArray];
得到的返回類型和方法所在類的類型相同汰规,是NSArray*!
總結(jié)一下汤功,instancetype的作用,就是使那些非關(guān)聯(lián)返回類型的方法返回所在類的類型溜哮!
三滔金、instancetype和id區(qū)別
(1)id在編譯的時(shí)候不能判斷對象的真實(shí)類型
instancetype在編譯的時(shí)候可以判斷對象的真實(shí)類型
(2)如果init方法的返回值是instancetype,那么將返回值賦值給一個(gè)其它的對象會報(bào)一個(gè)警告
如果是在以前, init的返回值是id,那么將init返回的對象地址賦值給其它對象是不會報(bào)錯(cuò)的
(3)id可以用來定義變量, 可以作為返回值, 可以作為形參
instancetype只能用于作為返回值色解,例如:
//err,expected a type?
- (void)setValue:(instancetype)value?
{?
? ? //do something?
}?
就是錯(cuò)的,應(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