Objective-C非正式协议和分类的区别

当一个项目需要使用到一些通用的方法,这些方法需要在多个类中使用,那么我们就可以使用非正式协议来定义这些方法,以便于多个类之间共享这些方法。比如,我们可以定义一个名为“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”的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值