繁体   English   中英

头脑风暴的Objective-C运行时

[英]Brainstorming Objective-C runtime

每当我回到了解Objective-C运行时的过程时,我最终都会弄乱我的大脑。 据我了解(通过阅读一些很棒的文章,如MetaclassesObj-C Runtime ),Objective-C类实际上是类对象,例如NSString本身就是其根元类的对象。 此外,其所谓的ivar“ isa ”指针保留了所有基本细节,例如超类,方法列表,名称等。以下仅基于此理论的一些问题-

(1)。 检查当前的objc / runtime.h声明,您将找到以下结构声明:

    struct objc_class {
        Class isa  OBJC_ISA_AVAILABILITY;

>     #if !__OBJC2__
        Class super_class                                        OBJC2_UNAVAILABLE;
        const char *name                                         OBJC2_UNAVAILABLE;
        long version                                             OBJC2_UNAVAILABLE;
        long info                                                OBJC2_UNAVAILABLE;
        long instance_size                                       OBJC2_UNAVAILABLE;
        struct objc_ivar_list *ivars                             OBJC2_UNAVAILABLE;
        struct objc_method_list **methodLists                    OBJC2_UNAVAILABLE;
        struct objc_cache *cache                                 OBJC2_UNAVAILABLE;
        struct objc_protocol_list *protocols                     OBJC2_UNAVAILABLE;
> 
> **#endif**

    } OBJC2_UNAVAILABLE;

我希望这意味着从Objective-C 2.0开始,该结构中所有可用的都是“ isa ”指针。 这似乎使该运行时理论的所有逻辑消失了。 现在,这些详细信息(如超类,方法列表等)存储在哪里?


(2)。 从技术上讲, isa是指向objc_class结构的指针,而objc_class本身具有isa作为其成员。 因此,当我尝试访问时(在AppDelegate中):

  NSLog(@"class isa ptr %@", isa->isa); 

要么

NSLog(@"class isa %@", ((Class)[NSString class])->name);

我收到一个编译时错误:

  • 成员引用基本类型“类”不是结构或联合。

为什么? 我认为访问结构成员的正确语法


(3)。 使用NSLog在控制台上打印“类”(我指的是typedef struct objc_class *Class )对象,显示“ Objective-C类”的名称。

NSLog(@"NSObject class %@", [NSObject class]);

怎么了 class是返回“ Class”对象的类方法。 如果要打印类名,则应这样打印:

NSLog(@"NSObject class %@", ((Class)[NSObject class])->name);

帮我弄清楚我所缺少的是什么。

(1)这些详细信息(如超类,方法列表等)现在存储在哪里?

在ObjC 2.0中,所有类详细信息都是私有实现详细信息。 也许数据布局实际上保持不变,也许不是。

(2)为什么我不能访问字段name

您引用的头文件说在ObjC 2.0中只有isa指针存在,所有其他内容都消失了。

(3)为什么NSLog [NSString class]打印为NSString

因为NSLog类似于-[NSString stringWithFormat:] description方法调用到提供的对象上。 显然,方法+[Class description]返回+[Class description]的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM