ios - 头脑 Storm Objective-C 运行时

标签 ios objective-c c objective-c-runtime

每次我重新开始理解 Objective-C 运行时,我的大脑都会变得困惑。据我所知(通过阅读一些很棒的文章,如 MetaclassesObj-C Runtime )Objective-C 类实际上是类对象,例如NSString 本身是其根元类的对象。此外,它所谓的ivar“isa”指针保留了所有基本细节,如父类(super class)、方法列表、名称等。下面是仅基于该理论的一些问题-

(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”指针。这似乎使该运行时理论的所有逻辑都消失了。这些详细信息(如父类(super class)、方法列表等)现在存储在哪里?


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

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

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

我收到一个编译时错误:

  • 成员引用基类型“Class”不是结构或 union 。

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


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

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

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

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

帮我找出我遗漏了什么。

最佳答案

(1) 这些细节如父类(super class)、方法列表等现在存储在哪里?

在 ObjC 2.0 中,所有类细节都是私有(private)实现细节。也许数据布局实际上保持不变,也许不是。

(2) 为什么我无法访问字段name

您引用的头文件说在 ObjC 2.0 中只有 isa 指针在那里,所有其他的东西都消失了。

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

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

关于ios - 头脑 Storm Objective-C 运行时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23251542/

相关文章:

ios - 如果我在我的应用程序上强制使用浅色模式,苹果会拒绝我的应用程序吗?

ios - Xcode 6.0.1 Instruments iOS8 - 在设备上进行分析时应用程序表现不正常

ios - 从 iOS 10.3 开始 : UIButton ignoring negative paragraph lineSpacing in NSAttributedString

ios - 二维数组 Objective-C

c - 在rodata中设置常量

C - 从文件中逐字读取并将其插入哈希表中

ios - Swift 2 从 View Controller 返回选项卡栏 Controller 中的选定选项卡

ios - 使用 swift 2.0 代码 Xcode 7.1 IOS 9.1 播放嵌入式声音

ios - 与 8.0.2 相比,是什么导致 8.1 中的自转发生巨大变化?

将 R 代码转换为 C 代码