MST

星途 面试题库

面试题:Objective-C中SEL类型与@selector的基础应用

在Objective-C中,SEL类型和@selector宏经常一起使用。请简述SEL类型是什么,@selector的作用是什么,并举例说明如何使用@selector获取SEL对象,以及SEL对象在消息传递机制中是如何被使用的。
16.7万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

SEL类型

SEL是一种数据类型,它本质上是一个指向方法选择器的指针。在Objective-C运行时系统中,每个方法都有一个与之关联的唯一标识符,这个标识符就是SELSEL类型的存在使得运行时系统能够快速定位并调用对象的方法。

@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方法的实现。