您好,登錄后才能下訂單哦!
在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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。