在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的文件结构和引入都不单纯。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。