MST

星途 面试题库

面试题:Objective-C中@optional方法的调用场景

在Objective-C协议中定义了@optional方法,请举例说明在实际开发中,哪些场景下会调用这些可选方法,并且如何判断一个对象是否实现了该可选方法并进行安全调用?
28.0万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

调用@optional方法的场景

  1. 代理模式:在代理模式中,一个对象(代理者)代表另一个对象(被代理者)进行某些操作。例如,在iOS开发中,UITableView的代理协议UITableViewDelegate中有很多@optional方法。比如tableView:heightForRowAtIndexPath:方法,用于指定表格中每行的高度。如果开发者想自定义表格行高,就可以实现这个可选方法;若不实现,表格会使用默认行高。这使得开发者可以根据需求灵活选择是否实现特定功能,而不是强制要求实现所有代理方法。
  2. 协议扩展:当框架提供一个协议,随着框架的更新,可能会添加新的功能。通过将新方法定义为@optional,可以保证旧版本的代码不会因为未实现新方法而出现编译错误。例如,某个第三方库定义了一个协议MyLibraryProtocol,最初只有几个必须实现的方法。随着库的更新,添加了一些新的辅助功能方法,将这些新方法定义为@optional,已使用该库的开发者的现有代码不会受到影响,同时有需求的开发者可以选择实现这些新方法来使用新功能。

判断对象是否实现可选方法并安全调用

在Objective-C中,可以使用respondsToSelector:方法来判断对象是否实现了某个方法,然后进行安全调用。示例代码如下:

// 假设定义了这样一个协议
@protocol MyProtocol <NSObject>
@optional
- (void)optionalMethod;
@end

// 某个类遵循该协议
@interface MyClass : NSObject <MyProtocol>
@end

@implementation MyClass
// 这里可以选择是否实现optionalMethod
@end

// 在其他地方调用
MyClass *myObject = [[MyClass alloc] init];
if ([myObject respondsToSelector:@selector(optionalMethod)]) {
    [myObject optionalMethod];
}

通过上述respondsToSelector:方法,先判断对象myObject是否实现了optionalMethod,如果实现了再进行调用,从而保证了调用的安全性。