返回

揭开OC中的对象本质和isa的秘密,带你深入理解Objective-C核心

IOS

对象本质

在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对象按照以下顺序布局:

  1. isa指针
  2. 属性
  3. 方法
+------------------------------------------------+
| isa pointer                                     |
+------------------------------------------------+
|属性1                                           |
+------------------------------------------------+
|属性2                                           |
+------------------------------------------------+
|方法1                                           |
+------------------------------------------------+
|方法2                                           |
+------------------------------------------------+

属性实现

在Objective-C中,属性是通过一对gettersetter方法实现的。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

在这个例子中,usernameageLGPerson类的属性,getUsernamesetUsernameusername属性的gettersetter方法,getAgesetAgeage属性的gettersetter方法。

方法实现

在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代码。