iOS 中內(nèi)省的幾個(gè)方法?class方法和objc_getClass方法有什么區(qū)別?

內(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容