內(nèi)?。↖ntrospection)是面向?qū)ο笳Z言和環(huán)境的一個(gè)強(qiáng)大特性,Objective-C和Cocoa在這個(gè)方面尤其的豐富。內(nèi)省是對象揭示自己作為一個(gè)運(yùn)行時(shí)對象的詳細(xì)信息的一種能力。這些詳細(xì)信息包括對象在繼承樹上的位置,對象是否遵循特定的協(xié)議,以及是否可以響應(yīng)特定的消息。NSObject協(xié)議和類定義了很多內(nèi)省方法,用于查詢運(yùn)行時(shí)信息,以便根據(jù)對象的特征進(jìn)行識(shí)別。
明智地使用內(nèi)省可以使面向?qū)ο蟮某绦蚋痈咝Ш蛷?qiáng)壯。它有助于避免錯(cuò)誤地進(jìn)行消息派發(fā)、錯(cuò)誤地假設(shè)對象相等、以及類似的問題。
iOS 中內(nèi)省的幾個(gè)方法
- 判斷對象類型:
-(BOOL) isKindOfClass: 判斷是否是這個(gè)類或者這個(gè)類的子類的實(shí)例
-(BOOL) isMemberOfClass: 判斷是否是這個(gè)類的實(shí)例
+ (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = object_getClass((id)self); tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
- (BOOL)isKindOfClass:(Class)cls {
for (Class tcls = [self class]; tcls; tcls = tcls->superclass) {
if (tcls == cls) return YES;
}
return NO;
}
+ (BOOL)isMemberOfClass:(Class)cls {
return object_getClass((id)self) == cls;
}
- (BOOL)isMemberOfClass:(Class)cls {
return [self class] == cls;
}
- 判斷對象or類是否有這個(gè)方法
-(BOOL) respondsToSelector: 判讀實(shí)例是否有這樣方法
+(BOOL) instancesRespondToSelector: 判斷類是否有這個(gè)方法
class方法和objc_getClass方法有什么區(qū)別
- object_getClass:獲得的是isa的指向,比如:實(shí)例對象的isa是類對象,類對象的isa是元類對象。
- self.class:當(dāng)self是實(shí)例對象的時(shí)候,返回的是類對象,否則則返回自身。類方法class,返回的是self,所以當(dāng)查找meta class時(shí),需要對類對象調(diào)用object_getClass方法。
+ (Class)class {
return self;
}
- (Class)class {
return object_getClass(self);
}
Class object_getClass(id obj)
{
if (obj) return obj->getIsa();
else return Nil;
}
inline Class
objc_object::getIsa()
{
if (isTaggedPointer()) {
uintptr_t slot = ((uintptr_t)this >> TAG_SLOT_SHIFT) & TAG_SLOT_MASK;
return objc_tag_classes[slot];
}
return ISA();
}
inline Class
objc_object::ISA()
{
assert(!isTaggedPointer());
return (Class)(isa.bits & ISA_MASK);
}
參考:
object_getClass(obj)與[obj class]的區(qū)別
iOS 中內(nèi)省的幾個(gè)方法?class方法和objc_getClass方法有什么區(qū)別
Objective-C Runtime 入院第一天—— isa 和 Class