objective-c - 为什么两个不同的实例的指针是相同的?

标签 objective-c runtime

这个问题我想了很久。如果有人能帮助我,我会很高兴。 我们知道每个实例对象都是一个具有isa指针的结构体。

typedef struct objc_object {
    Class isa;
} *id;

所以不同的实例应该有不同的isa。但事实恰恰相反。例如:

@interface Foo : NSObject
@property(nonatomic, strong) NSString *name;    
@end

然后

    Foo *foo1 = [[Foo alloc] init];
    foo1.name = @"foo1";

    Foo *foo2 = [[Foo alloc] init];
    foo2.name = @"foo2";

    NSLog(@"foo1->isa--%p", [foo1 class]);
    NSLog(@"foo2->isa--%p", [foo2 class]);

结果:

foo1->isa--0x10ed00df0
foo2->isa--0x10ed00df0

两个isa是一样的!为什么他们是一样的?但 foo1 与 foo2 不同! foo1.name 和 foo2.name 存储在哪里? foo1 和 foo2 的属性是否存储在一个表中,该表的键为“foo1”或“foo2”,值为属性列表?

最佳答案

isa 指针(读作:is a)指向该对象的类型信息,而不是其状态 (又名所有 ivars 值的集合)。因此,对于同一个类的两个对象(包括类对象),isa 指向相同的类型信息(类)。此类型信息是类型的通用描述(包括哪些方法、存在哪些 ivar),但不是实际值(也称为状态)。

状态——为了简化更复杂的东西——存储在isa“后面”:

instance i in memory
i+00 isa pointer           // points to the type, equal for all instances of a class
i+04 value of the 1st ivar // different for every instance
i+08 value of the 2nd ivar // "
…

因此,当从系统获取实例的内存时,它不仅仅是objc_object结构的内存,还包括ivars的内存。

你可以想象这样的事情:

struct objc_object   struct myClass_instance
{                    {
  Class isa;           Class isa;
                       id my1stIVar;
                       id my2ndIVar;
                       …
}                    }

请注意,有些年来实际的内存布局是不同的。不过,这个例子足以回答您的问题。

关于objective-c - 为什么两个不同的实例的指针是相同的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47385587/

相关文章:

Java进程可以从不同的位置执行吗?

c - 处理大型数组而不会出现运行时错误

java - 运行时 Java 中的重音问题

c++ - 全局变量初始化中的数学运算,机器是做什么的?

iphone - 以编程方式检测 ScrollView 外的触摸

ios - 使用密码在锁定屏幕上更改 NSFileManager 用户/权限

objective-c - 在 iOS 中验证 Dropbox

android - android 应用程序中的 process.waitFor() 返回 "1"

ios - 检查类 respondsToSelector 是否不工作

ios - 将 TableView Controller 中的单元格链接到网页