Objective-C:向类别添加属性

时间:2011-01-04 19:39:00

标签: objective-c attributes categories

我为NSDate构建了一个类别,我想在此类别中封装一个属性来保存一些数据。但我无法实现添加此属性,只能使用方法。

有没有办法实现这个目标?

谢谢。

4 个答案:

答案 0 :(得分:12)

这里有一些代码:

文件名:NSObject + dictionary.h

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface NSObject (dictionary)
- (NSMutableDictionary*) getDictionary;
@end

文件名:NSObject + dictionary.m

#import "NSObject+dictionary.h"
@implementation NSObject (dictionary)
- (NSMutableDictionary*) getDictionary
{
  if (objc_getAssociatedObject(self, @"dictionary")==nil) 
  {
    objc_setAssociatedObject(self,@"dictionary",[[NSMutableDictionary alloc] init],OBJC_ASSOCIATION_RETAIN);
  }
  return (NSMutableDictionary *)objc_getAssociatedObject(self, @"dictionary");
}

现在每个(每个类的)实例都有一个字典,您可以在其中存储自定义属性。 使用Key-Value Coding,您可以设置如下值:

[myObject setValue:attributeValue forKeyPath:@"dictionary.attributeName"]

你可以得到这样的价值:

[myObject valueForKeyPath:@"dictionary.attributeName"]

这甚至适用于Interface Builder和用户定义的运行时属性。

Key Path                   Type                     Value
dictionary.attributeName   String(or other Type)    attributeValue

答案 1 :(得分:4)

您无法在类别中添加实例变量。

但是,您可以使用 associative references 将属性的存储添加到对象。请注意,如果您需要添加多个属性,而不是为每个属性添加关联引用,那么最好添加对(例如)NSMutableDictionary,CFMutableDictionaryRef或NSMapTable的单个引用,并将其用于所有属性

答案 2 :(得分:2)

答案 3 :(得分:0)

如果要向班级添加属性,可以尝试使用github.com/libObjCAttr。它非常容易使用,通过pod添加它,然后你可以添加如下属性:

RF_ATTRIBUTE(YourAttributeClass, property1 = value1)
@interface NSDate (AttributedCategory)
@end

在代码中:

YourAttributeClass *attribute = [NSDate RF_attributeForClassWithAttributeType:[YourAttributeClass class]];
// Do whatever you want with attribute
NSLog(@"%@", attribute.property1)