面试题答案
一键面试SEL类型
SEL
是一种数据类型,它本质上是一个指向方法选择器的指针。在Objective-C运行时系统中,每个方法都有一个与之关联的唯一标识符,这个标识符就是SEL
。SEL
类型的存在使得运行时系统能够快速定位并调用对象的方法。
@selector宏的作用
@selector
宏用于创建一个SEL
类型的对象,它接受一个方法名作为参数,返回一个对应的SEL
对象。通过@selector
宏,可以将方法名转换为运行时系统能够识别的SEL
类型,从而在消息传递机制中使用。
使用@selector获取SEL对象示例
假设有一个Person
类,包含一个sayHello
方法,示例代码如下:
#import <Foundation/Foundation.h>
@interface Person : NSObject
- (void)sayHello;
@end
@implementation Person
- (void)sayHello {
NSLog(@"Hello!");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc] init];
SEL selector = @selector(sayHello);
if ([person respondsToSelector:selector]) {
[person performSelector:selector];
}
}
return 0;
}
在上述代码中,通过@selector(sayHello)
获取了sayHello
方法对应的SEL
对象,并通过respondsToSelector:
方法检查对象是否能响应该方法,若能响应则通过performSelector:
方法调用该方法。
SEL对象在消息传递机制中的使用
在Objective-C的消息传递机制中,当向一个对象发送消息时,例如[object message]
,编译器会将其转换为objc_msgSend(object, @selector(message))
形式。运行时系统首先会根据对象的类找到其方法列表,然后通过SEL
在方法列表中查找对应的方法实现。如果找到,就会调用该方法实现;如果没有找到,运行时系统会进行动态方法解析、备用接收者、完整的消息转发等一系列操作来尝试处理该消息。
例如,上面代码中[person performSelector:selector]
就是通过SEL
对象在person
对象所属类的方法列表中查找并调用sayHello
方法的实现。