面试题答案
一键面试调用@optional方法的场景
- 代理模式:在代理模式中,一个对象(代理者)代表另一个对象(被代理者)进行某些操作。例如,在iOS开发中,
UITableView
的代理协议UITableViewDelegate
中有很多@optional
方法。比如tableView:heightForRowAtIndexPath:
方法,用于指定表格中每行的高度。如果开发者想自定义表格行高,就可以实现这个可选方法;若不实现,表格会使用默认行高。这使得开发者可以根据需求灵活选择是否实现特定功能,而不是强制要求实现所有代理方法。 - 协议扩展:当框架提供一个协议,随着框架的更新,可能会添加新的功能。通过将新方法定义为
@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
,如果实现了再进行调用,从而保证了调用的安全性。