查看文档可知
Discussion The isa instance variable of the new instance is initialized to a data structure that describes the class; memory for all other instance variables is set to 0. isa实例变量指向一个描述类的结构体数据。而所有其它实例变量都会被设置为0值。 上一次看内存知道对象指针加8才是自己声明的实例变量的地址。前8个字节一直没有搞清楚是什么。多谢论坛中 fantacyleo的指点。其实对象开始8字节就是isa指针。那么他到底是不是呢,我做了一个简单的小程序,输出isa的地址。 - #import <Foundation/Foundation.h>
- //Person类声明
- @interface Person : NSObject
- {
- int _age;
- }
- - (void)setAge:(int)age;//设置_age
- - (int)age;//返回_age
- - (void*)getIsaAddr;//获取isa成员变量的地址
- @end
- //Student类声明
- @interface Student : Person
- {
- int _score;//分数
- }
- - (void)setScore:(int)score;//设置_score
- @end
- int main(int argc, const char * argv[])
- {
-
- Person *p = [Person new];
- [p setAge:0x88888888];
-
- NSLog(@"p = %p", p);
- NSLog(@"&(p->isa) = %p", [p getIsaAddr]);
-
-
-
- Student *stu = [Student new];
- [stu setAge:0x77777777];
- [stu setScore:0x66666666];
-
- NSLog(@"stu = %p", stu);
- NSLog(@"&(stu->isa) = %p", [stu getIsaAddr]);
-
-
-
- return 0;
- }
- //Person类的实现
- @implementation Person
- - (void)setAge:(int)age
- {
- _age = age;
- }
- - (int)age
- {
- return _age;
- }
- - (void*)getIsaAddr
- {
- //NSLog(@"size = %u", sizeof(isa));
- return (void*)&isa;
- }
- @end
- //Student类的实现
- @implementation Student
- - (void)setScore:(int)score
- {
- _score = score;
- }
- @end
复制代码
通过观察isa起始地址和对象的起始地址值是一样的,而isa在NSObject中被声明为一个指针,MAC OS系统是64位的,所以指针也就是64的。即占8字节空间。 所以由此可以判断对象的前8个字节就是isa指针。 isa在NSObject.h中声明: @interface NSObject <NSObject> { Class isa OBJC_ISA_AVAILABILITY;
}
而Class在objc.h中又被声明为:
/// An opaque type that represents an Objective-C class.
typedef struct objc_class *Class; 所以isa是就指向 objc_class结构体的指针。 而后4字节就是person类实例变量age所占用的内存空间;
再观察person类的子类Student对象中实例变量在内存中是怎么分布的 观察发现同样前8字节是isa指针,紧随其后依次存放的是实例变量age和score;
|