MST
星途 面试题库

面试题:Objective-C中反射机制的基本实现方式是什么

在Objective-C里,反射机制允许程序在运行时检查和修改类、对象及它们的属性和方法。请详细阐述Objective-C实现反射机制所涉及的关键类和函数,例如如何使用运行时库函数获取类的属性列表、方法列表等相关信息。
18.2万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

关键类和函数

  1. objc_class:在运行时,每个类都由一个 objc_class 结构体来表示,它包含了类的相关信息,如父类、元类、实例变量列表、方法列表等。虽然我们通常不直接操作 objc_class 结构体,但运行时函数会使用它来获取类的信息。
  2. 运行时库函数
    • 获取类相关信息
      • objc_getClass(const char *aClassName):通过类名获取类对象。例如:Class cls = objc_getClass("NSString");
      • object_getClass(id obj):获取对象所属的类。例如:NSString *str = @"Hello"; Class cls = object_getClass(str);
    • 获取属性列表
      • class_copyPropertyList(Class cls, unsigned int *outCount):获取类的属性列表。返回一个指向 objc_property_t 数组的指针,outCount 用于返回属性的数量。例如:
Class cls = [MyClass class];
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(cls, &outCount);
for (i = 0; i < outCount; i++) {
    objc_property_t property = properties[i];
    const char *propName = property_getName(property);
    NSLog(@"Property name: %s", propName);
}
free(properties);
- **获取方法列表**:
  - `class_copyMethodList(Class cls, unsigned int *outCount)`:获取类的实例方法列表。返回一个指向 `Method` 数组的指针,`outCount` 用于返回方法的数量。例如:
Class cls = [MyClass class];
unsigned int outCount, i;
Method *methods = class_copyMethodList(cls, &outCount);
for (i = 0; i < outCount; i++) {
    Method method = methods[i];
    SEL sel = method_getName(method);
    NSLog(@"Method name: %@", NSStringFromSelector(sel));
}
free(methods);
  - `class_copyClassMethodList(Class cls, unsigned int *outCount)`:获取类的类方法列表,用法与获取实例方法列表类似。

3. SEL(选择器)SEL 类型用于表示方法的名称。当一个方法被调用时,Objective - C 运行时会根据方法名生成对应的 SEL,然后在类的方法列表中查找并调用相应的方法实现。可以使用 @selector() 指令或者 sel_registerName(const char *str) 函数来创建 SEL。例如:SEL sel = @selector(methodName); 或者 SEL sel = sel_registerName("methodName");

  1. IMP(实现)IMP 是一个函数指针,指向方法的实际实现代码。可以通过 method_getImplementation(Method method)Method 结构体中获取 IMP。例如:
Method method = class_getInstanceMethod([MyClass class], @selector(methodName));
IMP imp = method_getImplementation(method);

通过这些关键类和函数,Objective - C 实现了强大的反射机制,使得程序能够在运行时动态地检查和修改类、对象及其属性和方法。