面试题答案
一键面试主要区别
- 定义与结构
- 协议(Protocol):定义了一系列方法的声明,但没有方法的实现。任何类只要声明遵守某个协议,就必须实现该协议中定义的方法(除非该协议中的方法被标记为可选)。协议主要用于实现多继承的类似功能,使不同类之间可以具有相同的行为。
- 类别(Category):为已存在的类添加新的方法,不能添加实例变量。类别可以对类进行功能扩展,而且不需要访问类的原始代码。
- 使用场景
- 协议(Protocol):用于不同类之间需要实现相同行为的情况,比如多个不同类都需要实现某个特定功能,通过遵守同一协议来实现。
- 类别(Category):用于对已有的类进行功能扩展,当无法获取类的原始代码或者不需要通过继承来扩展功能时使用。
协议使用场景举例
假设我们有不同类型的车辆类,如Car
、Bicycle
、Truck
,我们希望所有车辆都能实现一个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
这里Car
和Bicycle
类都遵守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
原始代码的情况下,为其添加了新的功能。