当一个项目需要使用到一些通用的方法,这些方法需要在多个类中使用,那么我们就可以使用非正式协议来定义这些方法,以便于多个类之间共享这些方法。比如,我们可以定义一个名为“Utilities”的非正式协议,并在其中定义一些通用的方法,比如:
// Utilities.h
@interface NSObject (Utilities)
- (void)log;
+ (void)alert:(NSString *)message;
@end
// Utilities.m
@implementation NSObject (Utilities)
- (void)log {
NSLog(@"%@ - %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
}
+ (void)alert:(NSString *)message {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert" message:message preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];
[alertController addAction:okAction];
[[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:alertController animated:YES completion:nil];
}
@end
然后,在项目中的多个类中就可以直接调用这些方法,比如:
#import "Utilities.h"
@interface MyClassA : NSObject
@end
@implementation MyClassA
- (void)someMethod {
[self log];
[NSObject alert:@"Hello world!"];
}
@end
@interface MyClassB : NSObject
@end
@implementation MyClassB
- (void)someMethod {
[self log];
[NSObject alert:@"Hello world!"];
}
@end
上面的例子中,我们定义了一个非正式协议 Utilities,并在其中定义了两个通用的方法 log 和 alert。然后,在 MyClassA 和 MyClassB 中,我们通过导入 Utilities.h 文件并调用其中的方法来实现日志打印和弹窗功能。这样,我们就可以将这些通用的方法组织在一起以便于在多个类之间共享。
另一方面,如果我们想要将一个类的方法分成多个文件或模块中,以便于组织和管理代码,那么我们就可以使用分类。比如,我们可以为 NSString 类添加一个名为“Utils”的分类,并在其中添加一些扩展方法,比如:
// NSString+Utils.h
@interface NSString (Utils)
- (NSString *)reversedString;
- (NSString *)trimmedString;
@end
// NSString+Utils.m
@implementation NSString (Utils)
- (NSString *)reversedString {
NSMutableString *reversedString = [NSMutableString stringWithCapacity:self.length];
for (NSInteger i = self.length - 1; i >= 0; i--) {
unichar ch = [self characterAtIndex:i];
[reversedString appendFormat:@"%C", ch];
}
return reversedString;
}
- (NSString *)trimmedString {
return [self stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
@end
然后,在需要使用这些扩展方法的地方,我们只需要导入 NSString+Utils.h 文件即可,比如:
#import "NSString+Utils.h"
NSString *str = @" Hello World! ";
NSLog(@"Reversed string: %@", [str reversedString]);
NSLog(@"Trimmed string: %@", [str trimmedString]);
上面的例子中,我们为 NSString 类添加了一个名为“Utils”的