iOS面試總結(jié)——NSProxy關(guān)鍵字、id、instancetype

最近面試的時候,面試官問到了一個問題,“你知道'id'和(NSObject *)的區(qū)別嗎”,有點懵,心里在想不應(yīng)該是問'id'和‘ instancetype’的區(qū)別嘛。。。
反正沒答上來,總結(jié)一下吧~

idinstancetype

instancetype clang 3.5提供的關(guān)鍵字, 表示:某方法返回未知類型的OC對象

都知道id任意類型關(guān)鍵字,為什么還會出現(xiàn)一個新的關(guān)鍵字?

返回關(guān)聯(lián)類型

1、類方法中,allocnew開頭

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

會返回方法所在類的類型的對象,即關(guān)聯(lián)返回類型的方法。

這些方法的返回結(jié)果以方法所在的類為類型。

for example

@interface NSObject

+(id)alloc;

-(id)init;

@end

當(dāng)我們初始化NSArray

NSArray*array = [[NSArray alloc] init];

[NSArray alloc]返回類型屬于關(guān)聯(lián)返回類型,NSArray *

instancetype

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

@interface NSArray

+(id)constructAnArray;

@end

當(dāng)我們初始化的時候

[NSArray constructAnArray]

得到返回類型和方法聲明的返回類型一樣,是id

如果使用 instancetype 作為返回類型

@interface NSArray

+(instancetype)constructAnArray;

@end

同樣方式初始化

[NSArray constructAnArray]

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

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

好處:確定對象類型幫編譯器更好定位代碼問題。

相同點:
作為方法的返回類型

不同點:
1、instancetype 可以返回和方法所在類相同類型的對象,id只能返回未知類型的對象。

2、instancetype只能作為返回值,id可以作為參數(shù).

-(void)setValue:(instancetype)value {

}

報錯!

應(yīng)該寫成

-(void)setValue:(id)value {

}

id NSProxy

眾所周知,NSObject類是Objective-C中大部分類的基類。但不是很多人知道除了NSObject之外的另一個基類——NSProxy Apple官方文檔
NSProxy是和NSObject同級的一個類,可以說它是一個虛擬類,它只是實現(xiàn)了<NSObject>的協(xié)議,它的作用有點類似于一個復(fù)制類,有人曾經(jīng)笑談它是卡卡西的復(fù)制忍術(shù),想想其實也挺貼切的,其實原理確實如此。OC確實是只能單繼承的語言,但是基于運行時的機(jī)制,卻有一種方法讓它來實現(xiàn)一下"偽多繼承",就是利用NSProxy這個類

回到之前的那個問題,答不上來只有問面試官,嘿嘿,面試官說由于NSProxy是和NSObject同級,所以說(NSObject *)還不能完全替代id萬能指針的作用,因為它還管不到NSProxy...額,好吧,

總的來說,NSProxy這個在日常開發(fā)者很少見的類,的確有著它奇淫之處,這里推薦幾個NSProxy相關(guān)的實踐
1
2

最后編輯于
?著作權(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)容