面试题答案
一键面试关键类和函数
objc_class
类:在运行时,每个类都由一个objc_class
结构体来表示,它包含了类的相关信息,如父类、元类、实例变量列表、方法列表等。虽然我们通常不直接操作objc_class
结构体,但运行时函数会使用它来获取类的信息。- 运行时库函数:
- 获取类相关信息:
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");
IMP
(实现):IMP
是一个函数指针,指向方法的实际实现代码。可以通过method_getImplementation(Method method)
从Method
结构体中获取IMP
。例如:
Method method = class_getInstanceMethod([MyClass class], @selector(methodName));
IMP imp = method_getImplementation(method);
通过这些关键类和函数,Objective - C 实现了强大的反射机制,使得程序能够在运行时动态地检查和修改类、对象及其属性和方法。