id返回不確定類型的對象(也就是任意類型的對象),- (id)arrayWithData;返回的就是不確定類型的對象,如果執行數組的方法, [- (id)arrayWithData objectOfIndex:0]編譯時不會報錯,但運行時會報錯,找不到該方法。
instancetype返回的類型是該類的對象,- (instancetype)arrayWithData;如果執行數組的方法, [- (instancetype)arrayWithData objectOfIndex:0]編譯時不會報錯,運行時也不會報錯。
總結一下,instancetype的作用,就是使那些非關聯返回類型的方法返回所在類的類型!
2、好處
能夠確定對象的類型,能夠幫助編譯器更好的為我們定位代碼書寫問題,比如:
- [[[NSArray?alloc]?init]?mediaPlaybackAllowsAirPlay];?//??"No?visible?@interface?for?`NSArray`?declares?the?selector?`mediaPlaybackAllowsAirPlay`" ???
- [[NSArray?array]?mediaPlaybackAllowsAirPlay];?//?(No?error)??
第一行代碼,由于[[NSArray?alloc]init]的結果是NSArray*,這樣編譯器就能夠根據返回的數據類型檢測出NSArray是否實現mediaPlaybackAllowsAirPlay方法。有利于開發者在編譯階段發現錯誤。
第二行代碼,由于array不屬于關聯返回類型方法,[NSArray?array]返回的是id類型,編譯器不知道id類型的對象是否實現了mediaPlaybackAllowsAirPlay方法,也就不能夠替開發者及時發現錯誤。