如何在Objective-C中在运行时向对象添加动态属性?

时间:2013-07-23 10:59:04

标签: objective-c objective-c-runtime

假设(为了争论)我在我的iOS项目中有一个包含一些处理的类。

我想知道是否可以在运行时向Objective C对象添加动态属性?

我需要动态创建一个来自NSDictionnary实例的对象,它具有非固定模式的键和值。要使用通用方法创建对象,我需要NSDictionnary中的Key用于属性名称,Val用于属性值。

-(NSMutableArray *) getFromJSON:(NSString *)json
{
JSONDecoder *decoder = [[JSONDecoder alloc] init];
NSData *jsonData = [json dataUsingEncoding:NSUTF8StringEncoding];
NSArray *array = [decoder objectWithData:jsonData];
NSMutableArray *data = [[NSMutableArray alloc] initWithArray:array];
for (int i = 0; i < [data count]; i++) {
    NSDictionary *modelData = [data objectAtIndex:i];
    // .... Object attributes creation goes here

在这个Line,我需要从这个Dic(modelData)创建一个对象,其属性名称必须与我们Dic的Keys相对应。创建的Object(虚拟类)的属性将是:

@property (nonatomic, strong) key0;
@property (nonatomic, strong) key1;
@property (nonatomic, strong) key2;

..等等。那可能吗?

我正在创建一个ModelManager和不同的Model子类,它们继承了ModelManager类并带有一些特定的动作。在ModelManager类中,我必须做一个创建NSMuttableArray的泛型方法,它包含NSObject的列表。这个对象对应于从Json请求中提取的数据。 每个Json请求都返回特定于一个Model的数据。我正在搜索如何使用通用方式执行此方法以在子类中继承它,并将该动态对象强制转换为子类的类型。我找到的唯一通用方法是创建一个创建了属性的虚拟类从json数据键开始,然后将此NSObject强制转换为Model子类类。

1 个答案:

答案 0 :(得分:0)

只需将其声明为财产。

@property (nonatomic, strong) NSDictionary * dic;

@property (nonatomic, strong) NSMutableDictionary * dic;

然后在运行时以你想要的方式创建它。

self.dic = @{randomKey : randomValue};

self.dic = [@{randomKey : randomValue} mutableCopy];