返回

对象底层结构与ISA&NONPOINTER_ISA剖析揭秘

前端

对象的本质

对象是面向对象编程的基本单位,它封装了数据和行为。在Objective-C中,对象本质上是一个结构体,它包含了对象的实例变量和isa指针。

struct object {
    Class isa;
    instance_variables;
};

其中,isa指针指向对象的类对象,它用于查找对象的类方法和实例方法。

isa指针

isa指针是对象结构体中的第一个成员,它指向对象的类对象。类对象也是一个结构体,它包含了指向类方法的指针、指向父类的指针,以及其他信息。

struct class {
    isa class; // Super class, or NULL if root class
    const char *name; // Class name
    class_ro_t *ro;
};

NonPointer_isa

NonPointer_isa是在编译时存储在对象中的一个整数,它指向对象的类对象。NonPointer_isa与isa指针不同,它不是一个指针,而是一个整数。这是因为在某些情况下,使用整数比使用指针更有效。例如,当对象是静态分配时,可以使用NonPointer_isa来访问对象的类对象。

编译器分析

为了更好地理解对象的底层结构和isa指针,我们可以通过编译器分析来查看编译后的代码。

// Objective-C代码
@interface Person : NSObject
{
    NSString *_name;
    int _age;
}

@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;

@end

@implementation Person

- (instancetype)initWithName:(NSString *)name age:(int)age
{
    self = [super init];
    if (self) {
        _name = name;
        _age = age;
    }
    return self;
}

@end

编译后的代码如下:

// 编译后的代码
struct objc_class Person_class {
    Class isa;
    const char *name;
    class_ro_t *ro;
};

struct Person {
    Class isa;
    NSString *_name;
    int _age;
};

Person *Person_new(Person_class *cls, NSString *name, int age)
{
    Person *self = objc_alloc(cls->superclass);
    if (self) {
        self->isa = cls;
        self->_name = name;
        self->_age = age;
    }
    return self;
}

NSString *Person_name(Person *self)
{
    return self->_name;
}

void Person_setName_(Person *self, NSString *name)
{
    self->_name = name;
}

int Person_age(Person *self)
{
    return self->_age;
}

void Person_setAge_(Person *self, int age)
{
    self->_age = age;
}

从编译后的代码中,我们可以看到对象的结构体包含了isa指针和实例变量。isa指针指向对象的类对象,实例变量存储了对象的具体数据。

总结

通过本文的分析,我们了解了Objective-C中对象的底层结构,以及isa指针和NonPointer_isa的作用。这些知识对于理解Objective-C对象模型和底层机制非常重要。