面试题答案
一键面试1. 协议定义方式
在Objective-C中,使用@protocol
关键字来定义协议。其语法格式如下:
@protocol 协议名 <NSObject>
// 声明方法列表,这些方法可以是必须实现的,也可以是可选实现的
@required
// 必须实现的方法声明
- (void)requiredMethod;
@optional
// 可选实现的方法声明
- (void)optionalMethod;
@end
NSObject
协议是所有协议的基础协议,通常会在定义协议时声明遵循NSObject
协议,这样协议中就可以使用NSObject
协议定义的一些基础方法,例如description
等。
2. 让一个类遵循某个协议
在类的声明时,在类名后的尖括号中列出要遵循的协议名,示例如下:
@interface MyClass : NSObject <MyProtocol>
// 类的其他声明内容
@end
这里MyClass
类声明遵循了MyProtocol
协议。
3. 在遵循协议的类中实现协议方法的要点
- 必须实现
@required
方法:如果一个类声明遵循了某个协议,那么协议中标记为@required
的方法必须在该类中实现,否则编译器会发出警告。例如:
@implementation MyClass
- (void)requiredMethod {
// 实现具体逻辑
NSLog(@"执行requiredMethod");
}
@end
- 可选实现
@optional
方法:对于协议中标记为@optional
的方法,遵循协议的类可以选择实现也可以不实现。如果实现,其实现方式和普通方法一样。例如:
@implementation MyClass
- (void)optionalMethod {
// 实现具体逻辑
NSLog(@"执行optionalMethod");
}
@end
- 动态检测协议方法实现:在运行时,可以通过
respondsToSelector:
方法来检测一个对象是否实现了某个协议方法,无论是@required
还是@optional
方法。示例如下:
MyClass *obj = [[MyClass alloc] init];
if ([obj respondsToSelector:@selector(optionalMethod)]) {
[obj optionalMethod];
}
这样可以避免向对象发送其未实现的方法而导致程序崩溃。