iPhone 静态库中使用Category

本文探讨了在静态库中使用Objective-C Category时遇到的问题及解决方法,通过创建冗余类来避免应用运行时出现崩溃。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   在iPhone开发中,Category是广泛使用的一种Objective-C的特性,不过如果在静态库中如果使用Category就会遇到一些意外的崩溃,原因就是在使用静态库的应用中会无法发现库中Category的声明。对此stack overflow上也有专门的讨论,并提示说要使用-all_load的编译选项。不过在我实际的项目开发中却这种方法却无法解决问题。经过一番调查和尝试,最终采用的解决办法就是创建一个冗余类,然后将所有的Category都放在该类的文件中,这样在无需实例化冗余类的情况就可以骗过编译器,从而解决了在静态库中使用Category会引发的崩溃问题。

CategoryDummy.h文件如下:

@interface CategoryDummy : NSObject {

}

@end

@interface UIButton(Addition)

- (void) addClickHandler:(SEL)onClick forTarget:(id)target; 
- (void) setClickHandler:(SEL)onClick forTarget:(id)target; 
- (void) setTitle: (NSString*)title;

@end

@interface UIColor (Addition)

+ (UIColor*) colorWithRGB:(Byte)red green:(Byte)green blue:(Byte)blue;

@end

 

CategoryDummy.m文件如下:

#import "CategoryDummy.h"

@implementation CategoryDummy

@end

@implementation UIButton(Addition)

- (void)addClickHandler:(SEL)onClickSel forTarget:(id)target { 
    [self addTarget:target action:onClickSel forControlEvents:UIControlEventTouchUpInside]; 
}

- (void)setClickHandler:(SEL)onClickSel forTarget:(id)target { 
    [self removeTarget:target action:NULL forControlEvents:UIControlEventTouchUpInside]; 
    [self addTarget:target action:onClickSel forControlEvents:UIControlEventTouchUpInside]; 
}

- (void) setTitle: (NSString*)title { 
    [self setTitle:title forState:UIControlStateNormal]; 
    [self setTitle:title forState:UIControlStateSelected]; 
    [self setTitle:title forState:UIControlStateHighlighted]; 
    [self setTitle:title forState:UIControlStateDisabled]; 
}

@end

@implementation UIColor (Addition)

+ (UIColor*) colorWithRGB:(Byte)red green:(Byte)green blue:(Byte)blue { 
    CGFloat fRed = red / 255.0f; 
    CGFloat fGreen = green / 255.0f; 
    CGFloat fBlue = blue / 255.0f; 
    return [UIColor colorWithRed:fRed green:fGreen blue:fBlue alpha:1.0f]; 
}

@end

  问题是解决了,副作用就是由于所有的Category都和冗余类在同一文件内声明和实现,导致使用某个Category的时候就需要导入CategoryDummy.h文件,也就意味着导入了所有的Category。Category的文件结构和引入都不单纯。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值