最近面試的時候延欠,面試官問到了一個問題陌兑,“你知道'id'和(NSObject *)的區(qū)別嗎”,有點懵由捎,心里在想不應該是問'id'和‘ instancetype’的區(qū)別嘛兔综。。狞玛。
反正沒答上來软驰,總結一下吧~
id
和instancetype
instancetype
clang 3.5
提供的關鍵字, 表示:某方法返回未知類型的OC對象
都知道id
任意類型關鍵字心肪,為什么還會出現(xiàn)一個新的關鍵字锭亏?
返回關聯(lián)類型
1、類方法中硬鞍,alloc
慧瘤, new
開頭
2、實例方法中 autorelease
固该,init
碑隆,retain
,self
開頭
會返回方法所在類的類型的對象,即關聯(lián)返回類型的方法蹬音。
這些方法的返回結果以方法所在的類為類型上煤。
for example
@interface NSObject
+(id)alloc;
-(id)init;
@end
當我們初始化NSArray
時
NSArray*array = [[NSArray alloc] init];
[NSArray alloc]
返回類型屬于關聯(lián)返回類型,NSArray *
instancetype
假如一個不是關聯(lián)返回類型的方法
@interface NSArray
+(id)constructAnArray;
@end
當我們初始化的時候
[NSArray constructAnArray]
得到返回類型和方法聲明的返回類型一樣著淆,是id
如果使用 instancetype
作為返回類型
@interface NSArray
+(instancetype)constructAnArray;
@end
同樣方式初始化
[NSArray constructAnArray]
得到的返回類型和方法所在類型相同劫狠,是NSArray *
instancetype
的作用拴疤,就是使那些非關聯(lián)返回類型的方法返回所在類的類型!
好處:確定對象類型幫編譯器更好定位代碼問題独泞。
相同點:
作為方法的返回類型
不同點:
1呐矾、instancetype
可以返回和方法所在類相同類型的對象,id只能返回未知類型的對象懦砂。
2蜒犯、instancetype
只能作為返回值,id可以作為參數(shù).
-(void)setValue:(instancetype)value {
}
報錯荞膘!
應該寫成
-(void)setValue:(id)value {
}
id NSProxy
眾所周知罚随,NSObject
類是Objective-C
中大部分類的基類。但不是很多人知道除了NSObject
之外的另一個基類——NSProxy Apple官方文檔
NSProxy是和NSObject
同級的一個類羽资,可以說它是一個虛擬類淘菩,它只是實現(xiàn)了<NSObject>
的協(xié)議,它的作用有點類似于一個復制類屠升,有人曾經(jīng)笑談它是卡卡西的復制忍術潮改,想想其實也挺貼切的,其實原理確實如此腹暖。OC確實是只能單繼承的語言汇在,但是基于運行時的機制,卻有一種方法讓它來實現(xiàn)一下"偽多繼承"脏答,就是利用NSProxy這個類
回到之前的那個問題糕殉,答不上來只有問面試官,嘿嘿以蕴,面試官說由于NSProxy是和NSObject
同級糙麦,所以說(NSObject *)
還不能完全替代id
萬能指針的作用辛孵,因為它還管不到NSProxy...額丛肮,好吧,
總的來說魄缚,NSProxy這個在日常開發(fā)者很少見的類宝与,的確有著它奇淫之處,這里推薦幾個NSProxy相關的實踐
1
2