instanceType 和 Id類型的區(qū)別

一、什么是instancetype

instancetype是clang 3.5開始,clang提供的一個關(guān)鍵字,表示某個方法返回的未知類型的Objective-C對象。我們都知道未知類型的的對象可以用id關(guān)鍵字表示,那為什么還會再有一個instancetype呢?

二,關(guān)聯(lián)返回類型(related result types)

根據(jù)Cocoa的命名規(guī)則,滿足下述規(guī)則的方法:

1、類方法中,以alloc或new開頭

2、實例方法中,以autorelease,init,retain或self開頭

會返回一個方法所在類類型的對象,這些方法就被稱為是關(guān)聯(lián)返回類型的方法。換句話說,這些方法的返回結(jié)果以方法所在的類為類型,說的有點繞口,請看下面的例子:

@interfaceNSObject

+?(id)alloc;

-?(id)init;

@end

@interfaceNSArray?:?NSObject

@end

當(dāng)我們使用如下方式初始化NSArray時:

NSArray*array = [[NSArrayalloc]init];

按照Cocoa的命名規(guī)則,語句[NSArrayalloc]的類型就是NSArray*因為alloc的返回類型屬于關(guān)

聯(lián)返回類型。同樣,[[NSArrayalloc]init]的返回結(jié)果也是NSArray*。

三、instancetype作用

1,作用

如果一個不是關(guān)聯(lián)返回類型的方法,如下:

@interfaceNSArray

+?(id)constructAnArray;

@end

當(dāng)我們使用如下方式初始化NSArray時:

[NSArray constructAnArray];

根據(jù)Cocoa的方法命名規(guī)范,得到的返回類型就和方法聲明的返回類型一樣,是id。

但是如果使用instancetype作為返回類型,如下:

@interfaceNSArray

+?(instancetype)constructAnArray;

@end

當(dāng)使用相同方式初始化NSArray時:

[NSArray constructAnArray];

得到的返回類型和方法所在類的類型相同,是NSArray*!

總結(jié)一下,instancetype的作用,就是使那些非關(guān)聯(lián)返回類型的方法返回所在類的類型!

2,好處

能夠確定對象的類型,能夠幫助編譯器更好的為我們定位代碼書寫問題,比如:

[[[NSArray alloc] init] mediaPlaybackAllowsAirPlay];//? "No visible @interface for `NSArray`?

declares the selector `mediaPlaybackAllowsAirPlay`"

[[NSArray array] mediaPlaybackAllowsAirPlay];//?(No?error)

上例中第一行代碼,由于[[NSArray alloc]init]的結(jié)果是NSArray*,這樣編譯器就能夠根據(jù)返回

的數(shù)據(jù)類型檢測出NSArray是否實現(xiàn)mediaPlaybackAllowsAirPlay方法。有利于開發(fā)者在編譯

階段發(fā)現(xiàn)錯誤。

第二行代碼,由于array不屬于關(guān)聯(lián)返回類型方法,[NSArrayarray]返回的是id類型,編譯器不

知道id類型的對象是否實現(xiàn)了mediaPlaybackAllowsAirPlay方法,也就不能夠替開發(fā)者及時發(fā)

現(xiàn)錯誤。

四,instanceType和id的異同

1,相同點

都可以作為方法的返回類型

2,不同點

①instancetype可以返回和方法所在類相同類型的對象,id只能返回未知類型的對象;

②instancetype只能作為返回值,不能像id那樣作為參數(shù),比如下面的寫法:

//err,expected a type

-?(void)setValue:(instancetype)value

{

//do?something

}

就是錯的,應(yīng)該寫成:

-?(void)setValue:(id)value

{

//do?something

}

----------摘自http://blog.csdn.net/wzzvictory/article/details/16994913

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容