返回
对象底层结构与ISA&NONPOINTER_ISA剖析揭秘
前端
2023-10-12 22:15:06
对象的本质
对象是面向对象编程的基本单位,它封装了数据和行为。在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对象模型和底层机制非常重要。