【问题标题】:Dynamically instantiating object Objective-C动态实例化对象 Objective-C
【发布时间】:2011-10-24 16:10:51
【问题描述】:

在 Java 中,我们可以像这样动态地实例化一个对象(只知道参数类型):

Class<?> msgClass = Class.forName(className);
constructor = msgClass.getConstructor(String.class, String.class, String.class);    
MyClass myClass = (MyClass) constructor.newInstance(myString, myString2, myString3);    

    public class MyClass {        
        public MyClass(String s, String s2, String s2){}
    }

有没有办法在objective-c中做同样的事情,只知道要传递给objective-c类构造函数的参数类型。

提前致谢。

【问题讨论】:

    标签: objective-c object dynamic instantiation


    【解决方案1】:

    是的,取决于你真正在做什么。 ObjC 没有同样的语言级“构造函数”——有init 方法通常与alloc 实例化方法一起调用,但请注意init 是按照框架约定而不是规范存在的,所以运行时不“知道”你想调用什么“构造函数”。

    你可以像这样实例化一个对象(相当于分配它):

    id myObj = class_createInstance(NSClassFromString(@"MyClass"));
    

    虽然你不妨更直接地这样做:

    id myObj = [NSClassFromString(@"MyClass") alloc];
    

    但是你仍然需要调用任何你想要的 init 方法。如果您不想直接执行此操作,则需要知道方法的选择器,以便向对象发送正确的消息。选择器是消息签名的静态表示。您可以像这样通过运行时 API 调用该方法:

    myObj = objc_msgSend(myObj, @selector(initWithStr1:str2:str3), myString1, myString2, myString3);
    // Check myObj for nil which means a failed init.
    

    ObjC 运行时参考:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

    【讨论】:

    • 因此,如果我不知道类的构造函数/方法/选择器名称,那么即使我知道参数,我也确实无法调用它。是否有某种查找可以根据可以采用的参数找到选择器。
    • 知道参数为什么不知道选择器?消息发送在 Obj-C 中是动态的,选择器是事物,用于标识您正在调用的方法。 (这不像 Java,你可以说“给我一个需要三个参数的 c'tor”——可能有多个以“init ...”开头的东西看起来像这样,你想知道哪个你在打电话。)查看上面链接的运行时文档。您可以使用class_copyMethodList 函数遍历方法,并检查它们的名称、选择器和参数等。
    • 在我应该知道选择器名称的情况下,我同意你的看法,但是在我将我的类设计为具有多个名称相同但传递的参数类型不同的选择器(init)的情况下.我如何区分它们之间的区别?我希望我很清楚,感谢您的帮助。
    • 你不能这样声明一个类;编译器不会让你。一个方法不能与另一个方法同名但参数类型不同。这就是为什么 ObjC 的 init 方法具有像 -initWithName:title:subtitle-initWithDate:attributes:flags 这样的名称。它们都采用 3 个参数,但名称不同,因此选择器也不同。您应该在这里提出一个新问题,详细说明您要完成的工作——您可能会得到一些惯用的 ObjC 设计帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 1970-01-01
    相关资源
    最近更新 更多