最近面試的時候,面試官問到了一個問題,“你知道'id'和(NSObject *)的區(qū)別嗎”,有點懵,心里在想不應(yīng)該是問'id'和‘ instancetype’的區(qū)別嘛。。。
反正沒答上來,總結(jié)一下吧~
id和instancetype
instancetype clang 3.5提供的關(guān)鍵字, 表示:某方法返回未知類型的OC對象
都知道id任意類型關(guān)鍵字,為什么還會出現(xiàn)一個新的關(guān)鍵字?
返回關(guān)聯(lián)類型
1、類方法中,alloc, new開頭
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