面试题答案
一键面试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
这样代码结构更加清晰,不同功能的代码分开管理,便于维护和扩展。