objective-c - 自动生成代码以创建具有未知类的对象

标签 objective-c class runtime instantiation

<分区>

我正在用 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!";

有什么想法吗?

最佳答案

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

- (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

关于objective-c - 自动生成代码以创建具有未知类的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18363077/

相关文章:

python - 静态变量simultaion : classes vs generators

java - 尽管混淆了真实的运行时方法名称?

c - 检测操作系统版本并相应地选择线程函数

objective-c - iOS - 如何调用 C 函数?

iphone - UIImageView 更改背景颜色和 setImage 在动画期间不起作用

objective-c - 为 iPhone 应用程序保存高分

java - 进度条,在命令行或复制任务功能中取得进展

ios - UITableView - BeginUpdates/EndUpdates 动画设置

class - Haxe 的类(class)类型是什么?

c++ - 在 C++ 中将类作为函数调用