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

如此一來,就能好好使用自定的函數跟變數囉。

其他參考資料:


, , , , ,

changyy 發表在 痞客邦 PIXNET 留言(0) 人氣()