id 和instancetype的區(qū)別

一、概述

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容