MST

星途 面试题库

面试题:Objective-C中类别(Category)的基本语法及常见用途

请写出Objective-C类别(Category)的基本语法结构,并举例说明至少两种它在实际开发中的常见用途。
24.1万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试

1. 基本语法结构

在Objective-C中,类别(Category)的基本语法结构如下:

@interface ClassName (CategoryName)
// 方法声明
@end

@implementation ClassName (CategoryName)
// 方法实现
@end

例如,为NSString类添加一个类别:

@interface NSString (MyCategory)
- (NSString *)reverseString;
@end

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

2. 实际开发中的常见用途

为现有类添加方法

比如,系统的UIView类没有直接获取其截图的方法,我们可以通过类别添加一个截图方法:

@interface UIView (Snapshot)
- (UIImage *)takeSnapshot;
@end

@implementation UIView (Snapshot)
- (UIImage *)takeSnapshot {
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, self.opaque, 0.0);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *snapshot = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return snapshot;
}
@end

这样在任何UIView及其子类的实例上都可以调用takeSnapshot方法来获取截图。

代码模块化和组织

假设我们有一个大型的ViewController类,其中包含大量不同功能的方法,例如用户登录相关、数据展示相关等。可以通过类别将这些方法进行模块化组织:

// UserLoginCategory.m
@interface ViewController (UserLogin)
- (void)showLoginView;
- (void)handleLoginButtonClick;
@end

@implementation ViewController (UserLogin)
- (void)showLoginView {
    // 显示登录视图的代码
}

- (void)handleLoginButtonClick {
    // 处理登录按钮点击的代码
}
@end

// DataDisplayCategory.m
@interface ViewController (DataDisplay)
- (void)fetchData;
- (void)displayData:(NSArray *)data;
@end

@implementation ViewController (DataDisplay)
- (void)fetchData {
    // 获取数据的代码
}

- (void)displayData:(NSArray *)data {
    // 展示数据的代码
}
@end

这样代码结构更加清晰,不同功能的代码分开管理,便于维护和扩展。