ios instancetype和id的區別

2021-08-03 16:15:33 字數 1267 閱讀 3396

@inte***ce nsobject  

+ (id)alloc;

- (id)init;

@end

@inte***ce nsarray : nsobject

@end

當我們使用如下方式初始化nsarray時:

nsarray *array = [[nsarray alloc] init];
按照cocoa的命名規則,語句[nsarray alloc] 的型別就是nsarray

因為alloc的返回型別屬於關聯返回型別。同樣,[[nsarray alloc]init] 的返回結果也是nsarray。

根據cocoa的命名規則,滿足下述規則的方法:

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

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

在ios開發中經常遇到instancetype和使用id的區別問題,比如:

- (instancetype)initwithframe:(cgrect)frame;

- (id)initwithframe:(cgrect)frame;

這個方法最直觀的區別就是返回型別不一樣,乙個是instancetype,另乙個是id

instancetype我們稱為關聯返回型別,這些方法返回以方法所在的類為型別,也就是說如果返回型別是instancetype,那麼這個方法的返回型別就是這個類的型別

instancetype的作用,就是使那些非關聯返回型別的方法返回所在類的型別!

instancetype的好處:能夠幫助編譯器更好的為我們定位**書寫的問題,有利於開發者在編譯階段發現錯誤;

id得到的返回型別就和方法宣告的返回型別一樣,是id

id和instancetype的不同點

1. instancetype可以返回和方法所在類相同的型別物件,id只能返回未知型別物件

2. instancetype只能作為返回值,不能像id那樣作為引數,比如:

instancetype作為引數(instancetype不能作為引數,這種寫法錯誤)

- (void)setlabel:(instancetype)label {}

id作為引數(id可以作為引數,這種寫法正確)

- (void)setlabel:(id)label {}

(補充)當父類的構造器想要被子類繼承的話,在父類的構造器中要使用[[self alloc]init]來建立物件,這樣才能使子類呼叫父類的構造器.

iOS中id與NSObject 和id的區別

1.我們來看看id的定義,它就是乙個指標,它可以指向的型別不僅限於nsobject 1typedefstructobjc class class 2typedefstructobjc object id 2.nsobject 就是 nsobject型別的指標了,它範圍較小。3.id是指標,它要求它指...

OC中instanceType和id的區別

今天在學習oc的過程中遇到關於instancetype和id的問題不太明白。查了一些資料後,總結它們兩個的區別和聯絡主要有以下幾點 相同點 instancetype和id都是作為方法的返回型別而被使用。不同點 1.instancetype可以返回和方法所在類相同型別的物件,id返回的型別只能是未知型...

Spring配置中的id和name屬性區分

在spring容器管理的bean中,必須僅且只有乙個無重複的id。一般情況下,配置乙個bean時,需要指定它的id屬性作為bean的名稱。class com.learnspring.hellworld q 如果在spring環境下,如果出現多個配置id屬性值一樣的bean 如果在配置bean的時候並...