4

我正在用 Python 编写一个脚本,该脚本从自定义文本中读取并从中生成 Objective-C 代码。正文结构如下:

<XClassName> {
    property_name_1 {
        var_name_1: var_value_1
        var_name_2: var_value_2
        property_name_2 {
            var_name_3: var_value_3
        }
        property_name_2 {
            var_name_3: var_value_4
        }
    }
    property_name_3 {
    }
}

产生这样的Objective-C代码:

XClassName* object = [[XClassName alloc] init];
object.propertyName1 = [[[object.propertyName1 class] alloc] init];
object.propertyName1.varName1 = varValue1;
object.propertyName1.varName2 = varValue2;
object.propertyName2Array = [NSMutableArray array];
{
    PropertyName2Class propertyName2 = [[PropertyName2Class alloc] init];
    propertyName2.varName3 = varValue3;
    [object.propertyName2Array addObject:propertyName2];
}
{
    PropertyName2Class propertyName2 = [[PropertyName2Class alloc] init];
    propertyName2.varName3 = varValue4;
    [object.propertyName2Array addObject:propertyName2];
}
object.propertyName3 = [[[object.propertyName3 class] alloc] init];

这很好,只是PropertyName2Class在脚本运行时不知道。现在我必须手动查找对象数组预期元素的类名,但这违背了让脚本自动化它的目的。

有没有办法在不知道其类名并为其属性赋值的情况下动态创建对象?就像是:

id classObject = ...; // How to instantiate a dynamic unknown class?
classObject.property1 = 1;
classObject.property2 = @"Hello World!";

有任何想法吗?

4

2 回答 2

5

如果您知道要实例化的类存在,例如如果它作为变量传入,那么这相对容易。你可以做:

- (id)createInstanceOfClass: (NSString *)className
{
  Class aClass = NSClassFromString(className);
  id instance = nil
  if(nil != aClass)
  {
    instance = [[aClass alloc] init];
  }
  return instance;
}

如果它不存在,您可以在运行时创建它的一个实例,但这有点棘手(也有点狡猾)。

更新

我会避免尝试使用具有您需要的已经存在的属性的类,除非您确定它的实现是做什么的。更安全的解决方案是从头开始构建一个类并指定实现是什么。

尝试阅读:

http://www.mikeash.com/pyblog/friday-qa-2010-11-6-creating-classes-at-runtime-in-objective-c.html

(不适合胆小的人!)

另请参阅 Objective-C 运行时参考:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40008048

于 2013-08-21T16:46:26.080 回答
3

我会为此使用 NSMutableDictionary :

NSMutableDictionary *object = [NSMutableDictionary dictionary];
[object setValue:[NSNumber numberWithInt:1] forKey:@"property1"];
[object setValue:@"Hello World!" forKey:@"property2"];

NSMutableDictionary *subObject = [NSMutableDictionary dictionary];
[subObject setValue:@"Hello sub!" forKey:@"property1"];

[object setValue:subObject forKey:@"property3"];
于 2013-08-21T16:43:40.757 回答