[英]Brainstorming Objective-C runtime
每当我回到了解Objective-C运行时的过程时,我最终都会弄乱我的大脑。 据我了解(通过阅读一些很棒的文章,如Metaclasses , Obj-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);
帮我弄清楚我所缺少的是什么。
在ObjC 2.0中,所有类详细信息都是私有实现详细信息。 也许数据布局实际上保持不变,也许不是。
name
? 您引用的头文件说在ObjC 2.0中只有isa
指针存在,所有其他内容都消失了。
NSLog
[NSString class]
打印为NSString
? 因为NSLog
类似于-[NSString stringWithFormat:]
description
方法调用到提供的对象上。 显然,方法+[Class description]
返回+[Class description]
的名称。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.