object_getClass(obj)和[obj class]给出不同的结果

Boo*_*oon 4 cocoa-touch objective-c objective-c-runtime

调用object_getClass(obj)和[obj class]时,我得到两个不同的对象实例.知道为什么吗?

Class cls = object_getClass(obj);
Class cls2 = [obj class];

(lldb) po cls
$0 = 0x0003ca00 Test
(lldb) po cls2
$1 = 0x0003ca14 Test
(lldb) 
Run Code Online (Sandbox Code Playgroud)

Jan*_*ano 11

我怀疑obj,尽管名字,是一个班级.例:

Class obj = [NSObject class];
Class cls = object_getClass(obj);
Class cls2 = [obj class];
NSLog(@"%p",cls);  // 0x7fff75f56840
NSLog(@"%p",cls2); // 0x7fff75f56868
Run Code Online (Sandbox Code Playgroud)

原因是Class对象的类是同一个类,而object_getClassClass的类是元类(类的类).这是有道理的,因为Class是元类的一个实例,并根据文档object_getClass返回" 对象是一个实例的类对象 ".LLDB的输出将是:

(lldb) p cls
(Class) $0 = NSObject
(lldb) p cls2
(Class) $1 = NSObject
(lldb) po cls
$2 = 0x01273bd4 NSObject
(lldb) po cls2
$3 = 0x01273bc0 NSObject
Run Code Online (Sandbox Code Playgroud)

如果替换Class obj = [NSObject class];NSObject *obj = [NSObject new];,则在打印cls和cls2时结果将相同.那是,

    NSObject *obj = [NSObject new];
    Class cls = object_getClass(obj);
    Class cls2 = [obj class];
    NSLog(@"%p",cls);  // 0x7fff75f56840
    NSLog(@"%p",cls2); // 0x7fff75f56840
Run Code Online (Sandbox Code Playgroud)

  • LLDB具有针对特定类型的自定义格式化程序.如果你输入`type summary list`你会得到它们的列表,在顶部你会看到Class属于objc类,它说(跳过指针).你可以禁用或启用类别,例如:`type category disable objc`然后再试一次,你会看到指针,替换为enable再次启用它.默认类别在某处的磁盘上,您可以添加自己的类别.有关详细信息,请参见http://lldb.llvm.org/varformats.html. (2认同)