Objective-c中的动态对象属性

时间:2010-07-30 00:31:59

标签: iphone objective-c

如何在objective-c中的对象上创建动态属性? 在ActionScript中我们可以做这样的事情

var obj : Object;
obj[ "myDynamicProperty" ] = true;
trace( obj.myDynamicProperty );

我如何在objective-c中执行此操作?

我试过以下

NSObject *obj = [[NSObject alloc] init];
[obj setValue:@"labelValue" forKey:@"label"];

但是这只会引发运行时错误。 任何帮助将非常感激。 提前谢谢。

3 个答案:

答案 0 :(得分:10)

Objects-NSObjects,具体而言Objective-C不允许使用KVC在其上设置任意属性;也就是说,它们不是键值容器。如果您想要可以接受任意键值对的内容,请使用字典(NSMutableDictionary)。

如果您足够舒适地下降到Obj-C运行时,也可以使用关联的对象API。在文档中搜索objc_setAssociatedObject,了解如何使用此API

答案 1 :(得分:3)

如果除了任意属性之外还需要自定义行为,则可以创建decorator对象。创建自己的包含NSMutableDictionary实例变量的自定义类,然后编写自己的方法,只需在该内部字典上调用setValue:forKey:等等。

答案 2 :(得分:0)

Objective-C中的对象通常不会以这种方式工作。使用runtime functions是可能的,但求助于运行时函数很尴尬,通常不是惯用的。如果需要任意键值存储,请使用NSMutableDictionary。

通常,在Objective-C中这是一个很好的做法,因此每个对象都有一组固定的属性,而不是像我们有时在ActionScript / Javascript中那样在 ad hoc 上添加它们。