1洋侨、關(guān)聯(lián)返回類型(related result types)的方法
根據(jù)Cocoa的命名規(guī)則,滿足下述規(guī)則的方法:
1铡俐、類方法中凰兑,以alloc或new開頭
2、實例方法中审丘,以autorelease吏够,init,retain或self開頭
會返回一個方法所在類類型的對象滩报,這些方法就被稱為是關(guān)聯(lián)返回類型的方法锅知。
換句話說,這些方法的返回結(jié)果的類型是 (方法所在的類 的類型)脓钾。
舉個例子:
@interface NSObject
+ (id)alloc;
- (id)init;
@end
@interface Person : NSObject
@end
Person *Peter = [[Person alloc] init];
[Person alloc] 返回的類型就是Person類型
因為alloc的返回類型屬于關(guān)聯(lián)返回類型售睹。
同樣,[[Person alloc]init] 的返回結(jié)果也是Person可训。
2昌妹、instancetype作用
@interface Person
+ (id)makeNewPerson;
+ (instancetype)buildNewPerson;
@end
[Person makeNewPerson]; //返回的是id類型
[Person buildNewPerson]; //返回的是Person類型
makeNewPerson得到的返回類型就和方法聲明的返回類型一樣捶枢,是id
buildNewPerson得到的返回類型和方法所在類的類型相同,是Person
instancetype的作用飞崖,就是使那些非關(guān)聯(lián)返回類型的方法返回所在類的類型烂叔。
3、使用instancetype的好處
能夠確定對象的類型固歪,能夠幫助編譯器更好的為我們定位代碼書寫問題蒜鸡,比如:
[[[Person alloc] init] makeBaby];
//會有報錯
// "No visible @interface for `Person ` declares the selector `makeBaby `"
[[Person makeNewPerson] makeBaby];
// (No error) -沒有報錯
[[Person alloc]init]的結(jié)果是Person類型,這樣編譯器就能夠根據(jù)返回的數(shù)據(jù)類型檢測出Person是否實現(xiàn)makeBaby方法牢裳。有利于開發(fā)者在編譯階段發(fā)現(xiàn)錯誤逢防。
makeNewPerson不屬于關(guān)聯(lián)返回類型方法,[Person makeNewPerson]返回的是id類型蒲讯,編譯器不知道id類型的對象是否實現(xiàn)了makeBaby方法忘朝,也就不能夠替開發(fā)者及時發(fā)現(xiàn)錯誤。
4判帮、instancetype和id的異同
相同點:
都可以作為方法的返回類型
不同點:
①instancetype可以返回和方法所在類相同類型的對象辜伟,id只能返回未知類型的對象;
②instancetype只能作為返回值脊另,不能像id那樣作為參數(shù)