對象在運行時獲取其類型的能力稱為內(nèi)省。內(nèi)省可以有多種方法實現(xiàn)倒得。
OC運行時內(nèi)省的4個方法:
判斷對象類型:
-(BOOL) isKindOfClass: 判斷是否是這個類或者這個類的子類的實例
-(BOOL) isMemberOfClass: 判斷是否是這個類的實例
判斷對象/類是否有這個方法
-(BOOL) respondsToSelector: 判讀實例是否有這樣方法
+(BOOL) instancesRespondToSelector: 判斷類是否有這個方法
在 Objective-C 中,id類型類似于(void*) 夭禽,可以指向任何類的對象霞掺,但在運行時對象的類型不再是id,而是該對象真正所屬的類讹躯。
Person *person = [[Person alloc] init];
NSArray *arr = @[person];
id obj = arr[0]; //OC集合中取出的對象都是id類型
此時可通過
BOOL isPersonClass = [obj isKindOfClass: [Person class] ];
來判斷obj是否Person類型或其子類的對象菩彬。
在 Objective-C 中,用父類類型定義的指針蜀撑,可以指向其子類的對象挤巡,但在運行時對象真實類型會是子類剩彬。
//例如 Boy是Person的子類酷麦,現(xiàn)定義:
Person *p = [[Boy alloc] init];
可通過 BOOL isBoy = [p isMemberOfClass: [Boy class] ];
判斷Person *類型的p是否是Boy類型。
更多:iOS面試題合集