2012年9月15日 星期六

iOS 開發筆記 - 使用 Category 擴充 functions 與 variables

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


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


其他參考資料:



沒有留言:

張貼留言