MST

星途 面试题库

面试题:Objective-C 协议与类别(Category)的区别及应用场景

阐述Objective-C中协议(Protocol)和类别(Category)的主要区别,并分别举例说明在实际开发中,哪些场景适合使用协议,哪些场景适合使用类别。
10.3万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

主要区别

  1. 定义与结构
    • 协议(Protocol):定义了一系列方法的声明,但没有方法的实现。任何类只要声明遵守某个协议,就必须实现该协议中定义的方法(除非该协议中的方法被标记为可选)。协议主要用于实现多继承的类似功能,使不同类之间可以具有相同的行为。
    • 类别(Category):为已存在的类添加新的方法,不能添加实例变量。类别可以对类进行功能扩展,而且不需要访问类的原始代码。
  2. 使用场景
    • 协议(Protocol):用于不同类之间需要实现相同行为的情况,比如多个不同类都需要实现某个特定功能,通过遵守同一协议来实现。
    • 类别(Category):用于对已有的类进行功能扩展,当无法获取类的原始代码或者不需要通过继承来扩展功能时使用。

协议使用场景举例

假设我们有不同类型的车辆类,如CarBicycleTruck,我们希望所有车辆都能实现一个start方法来启动车辆。可以定义一个协议:

@protocol VehicleProtocol <NSObject>
- (void)start;
@end

@interface Car : NSObject <VehicleProtocol>
@end

@implementation Car
- (void)start {
    NSLog(@"Car is starting.");
}
@end

@interface Bicycle : NSObject <VehicleProtocol>
@end

@implementation Bicycle
- (void)start {
    NSLog(@"Bicycle is starting.");
}
@end

这里CarBicycle类都遵守VehicleProtocol协议,并实现start方法,从而具备了相同的启动行为。

类别使用场景举例

假设我们有一个NSString类,在很多地方我们需要给它添加一个将字符串反转的功能。我们可以使用类别来扩展NSString

@interface NSString (Reverse)
- (NSString *)reversedString;
@end

@implementation NSString (Reverse)
- (NSString *)reversedString {
    NSMutableString *reversed = [NSMutableString stringWithString:self];
    [reversed reverse];
    return [NSString stringWithString:reversed];
}
@end

// 使用时
NSString *original = @"hello";
NSString *reversed = [original reversedString];
NSLog(@"%@", reversed); 

通过类别,在不修改NSString原始代码的情况下,为其添加了新的功能。