返回
揭开OC中的对象本质和isa的秘密,带你深入理解Objective-C核心
IOS
2023-09-02 07:59:05
对象本质
在Objective-C中,对象本质上是一个数据结构,包含了对象的属性和方法。对象的数据结构可以通过clang
编译器生成的主文件.cpp
查看。例如,对于LGPerson
类,它的数据结构如下:
struct LGPerson_IMPL {
Class isa;
char[12] _username;
int _age;
};
从这个结构体中,我们可以看到LGPerson
对象包含了一个isa
指针,指向该对象的类对象,以及两个属性_username
和_age
。
isa
isa
指针是Objective-C对象的一个重要组成部分,它指向该对象的类对象。类对象是一个特殊的对象,它包含了该类所有实例的元信息,包括类名、属性列表、方法列表等。
struct objc_class {
Class isa;
const char *name;
long version;
long info;
long instance_size;
struct objc_method_list *methods;
struct objc_ivar_list *ivars;
struct objc_method_list **protocols;
};
从这个结构体中,我们可以看到类对象包含了一个isa
指针,指向其父类的类对象,以及类名、版本号、实例大小、方法列表、属性列表和协议列表等信息。
内存布局
在内存中,Objective-C对象按照以下顺序布局:
isa
指针- 属性
- 方法
+------------------------------------------------+
| isa pointer |
+------------------------------------------------+
|属性1 |
+------------------------------------------------+
|属性2 |
+------------------------------------------------+
|方法1 |
+------------------------------------------------+
|方法2 |
+------------------------------------------------+
属性实现
在Objective-C中,属性是通过一对getter
和setter
方法实现的。getter
方法用于获取属性的值,setter
方法用于设置属性的值。
@interface LGPerson : NSObject
{
NSString *_username;
int _age;
}
@property (nonatomic, copy) NSString *username;
@property (nonatomic, assign) int age;
@end
@implementation LGPerson
- (NSString *)username {
return _username;
}
- (void)setUsername:(NSString *)username {
_username = username;
}
- (int)age {
return _age;
}
- (void)setAge:(int)age {
_age = age;
}
@end
在这个例子中,username
和age
是LGPerson
类的属性,getUsername
和setUsername
是username
属性的getter
和setter
方法,getAge
和setAge
是age
属性的getter
和setter
方法。
方法实现
在Objective-C中,方法是通过一个IMP
指针实现的。IMP
指针指向该方法的实现代码。
@interface LGPerson : NSObject
{
NSString *_username;
int _age;
}
- (void)sayHello;
@end
@implementation LGPerson
- (void)sayHello {
NSLog(@"Hello, world!");
}
@end
在这个例子中,sayHello
方法的实现代码是NSLog(@"Hello, world!");
。
总结
通过这篇文章,我们对Objective-C中的对象本质和isa有了更深入的认识。我们了解了对象在内存中的布局,属性和方法的实现方式。这些知识将帮助我们更好地理解和编写Objective-C代码。