Category 對 Objective C 是一個很彈性的架構,它可以在不破壞 framework 架構下,彈性地新增一些好玩的 functions 和 variables。
以 UIImage 這個 class 來講,提供 getResizeImage 的函數:
@interface UIImage (MyLib)
- (UIImage *)getResizeImage:(CGSize)size;
@end
@implementation UIImage (MyLib)
- (UIImage *)getResizeImage:(CGSize)size {
return nil;
}
@end
如此一來,所有的 UIImage 物件都可以使用 [obj getResizeImage:CGSizeMake(width, height)]; 來產生新的縮圖。
然而,有時候則需要搭配一些 variables 來記錄一些狀態,這時就會想到 @property 和 @synthesize 的搭配,可惜的在 Category 狀態下無法使用 @synthesize 來實作,取而代之的是 @dynamic 並且自行實作 setter/getter 函數,如:
UIImage+MyLib.h:
#import <objc/runtime.h>
#import <Foundation/Foundation.h>
@interface UIImage (MyLib)
@property (nonatomic, retain) NSMutableDictionary *otherInfo;
- (UIImage *)getResizeImage:(CGSize)size;
@end
UIImage+MyLib.m:
#import "UIImage+MyLib.h"
@implementation UIImage (MyLib)
@dynamic otherInfo;
NSString * const kOtherInfo = @"kOtherInfo";
- (void)setOtherInfo:(NSMutableDictionary *)obj {
objc_setAssociatedObject( self, kOtherInfo, obj, OBJC_ASSOCIATION_RETAIN);
}
- (NSMutableDictionary *)otherInfo {
return objc_getAssociatedObject(self, kOtherInfo);
}
- (UIImage *)getResizeImage:(CGSize)size {
if( self.otherInfo ) {
}
return nil;
}
@end
如此一來,就能好好使用自定的函數跟變數囉。
其他參考資料:
沒有留言:
張貼留言