在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的文件结构和引入都不单纯。