返回

剖析类的属性、方法、实例变量、类方法的源码结构

IOS

类的结构

Objective-C 中的类是通过 objc_class 结构体来表示的。它定义了类的名称、大小、父类、实例变量、方法、类方法等信息。我们可以通过 class_inspect 函数来查看类的结构体信息。

#include <objc/runtime.h>

void printClassStructure(Class cls) {
  objc_class* class = (objc_class*)cls;
  printf("Class name: %s\n", class->name);
  printf("Class size: %lu\n", class->instance_size);
  printf("Parent class: %s\n", class->superclass->name);
  printf("Instance variables:\n");
  for (uint32_t i = 0; i < class->ivars->count; i++) {
    Ivar ivar = class->ivars->ivar_list[i];
    printf(" - %s %s\n", ivar_getName(ivar), ivar_getTypeEncoding(ivar));
  }
  printf("Methods:\n");
  for (uint32_t i = 0; i < class->methods->count; i++) {
    Method method = class->methods->method_list[i];
    printf(" - %s %s\n", method_getName(method), method_getTypeEncoding(method));
  }
  printf("Class methods:\n");
  for (uint32_t i = 0; i < class->class_methods->count; i++) {
    Method method = class->class_methods->method_list[i];
    printf(" - %s %s\n", method_getName(method), method_getTypeEncoding(method));
  }
}

属性

属性是类的公开接口,它允许外界访问和修改类的私有变量。属性的实现实际上是通过 getter 和 setter 方法来完成的。我们可以通过 @property 语法来声明属性,也可以通过 objc_property_t 结构体来操作属性。

@interface Person : NSObject

@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;

@end

@implementation Person

- (NSString *)name {
  return _name;
}

- (void)setName:(NSString *)name {
  _name = name;
}

- (NSInteger)age {
  return _age;
}

- (void)setAge:(NSInteger)age {
  _age = age;
}

@end

方法

方法是类的行为,它定义了类可以执行的操作。方法可以通过 @interface 语法来声明,也可以通过 Method 结构体来操作方法。

@interface Person : NSObject

- (void)sayHello;

@end

@implementation Person

- (void)sayHello {
  NSLog(@"Hello, world!");
}

@end

实例变量

实例变量是类的私有变量,它属于类的每个实例。实例变量可以通过 @interface 语法来声明,也可以通过 Ivar 结构体来操作实例变量。

@interface Person : NSObject

{
  NSString *_name;
  NSInteger _age;
}

@end

@implementation Person

@end

类方法

类方法是属于类的静态方法,它不依赖于类的实例。类方法可以通过 + 号来声明,也可以通过 Method 结构体来操作类方法。

@interface Person : NSObject

+ (void)sayHello;

@end

@implementation Person

+ (void)sayHello {
  NSLog(@"Hello, world!");
}

@end

总结

通过对类的源码结构进行剖析,我们对类的属性、方法、实例变量和类方法有了更深入的了解。这些概念是 Objective-C 中类的基本组成部分,掌握它们对于理解 Objective-C 的类机制和编写高质量的代码至关重要。