MST

星途 面试题库

面试题:Objective-C中协议(Protocol)的基本使用

请简述Objective-C中协议(Protocol)的定义方式,并举例说明如何让一个类遵循某个协议,以及在遵循协议的类中实现协议方法的要点。
44.9万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

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];
}

这样可以避免向对象发送其未实现的方法而导致程序崩溃。