Objective-C 关联对象
最近在 Mac OS X 10.6 雪豹 中新引入了关联引用。Objective-C 不能动态的添加一些属性到对象上,和其他的一些原生支持这点的语言不一样。所以之前你都不得不努力为未来要增加的变量预留好空间。在 Mac OS X 10.6 中,Objective-C 的 Runtime 已经原生的支持这个功能了。如果我们想向一个已有的类添加变量,看起来像这样…
#import //Cocoa
#include //objc runtime api’s
@interface NSView (CustomAdditions)
@property(retain) NSImage *customImage;
@end
@implementation NSView (CustomAdditions)
static char img_key;//has a unique address (identifier)
- (NSImage *)customImage
{
returnobjc_getAssociatedObject(self,&img_key);
}
- (void)setCustomImage:(NSImage *)image
{
objc_setAssociatedObject(self, &img_key,image, OBJC_ASSOCIATION_RETAIN);
}
@end
objc_setAssociatedObject() 的选项,你可以在 runtime.h 文件中找到。
/* Associated Object support. */
/* objc_setAssociatedObject() options */
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
这些和 @property 语法中的选项意思一样。
网友评论