Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 动态实例化object-C_Objective C_Object_Dynamic_Instantiation - Fatal编程技术网

Objective c 动态实例化object-C

Objective c 动态实例化object-C,objective-c,object,dynamic,instantiation,Objective C,Object,Dynamic,Instantiation,在Java中,我们可以动态地实例化对象(只知道参数类型),如下所示: Class<?> msgClass = Class.forName(className); constructor = msgClass.getConstructor(String.class, String.class, String.class); MyClass myClass = (MyClass) constructor.newInstance(myString, myString2, myStr

在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){}
    }
id myObj = class_createInstance(NSClassFromString(@"MyClass"));
myObj = objc_msgSend(myObj, @selector(initWithStr1:str2:str3), myString1, myString2, myString3);
// Check myObj for nil which means a failed init.
Class msgClass=Class.forName(className);
constructor=msgClass.getConstructor(String.class,String.class,String.class);
MyClass MyClass=(MyClass)构造函数.newInstance(myString、myString、myString);
公共类MyClass{
公共MyClass(字符串s、字符串s2、字符串s2){}
}
在objective-c中是否有同样的方法,只知道要传递给objective-c类构造函数的参数类型


提前谢谢。

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

您可以像这样实例化对象(相当于分配对象):

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){}
    }
id myObj = class_createInstance(NSClassFromString(@"MyClass"));
myObj = objc_msgSend(myObj, @selector(initWithStr1:str2:str3), myString1, myString2, myString3);
// Check myObj for nil which means a failed init.
尽管您也可以更直接地执行此操作:

id myObj = [NSClassFromString(@"MyClass") alloc];
但是你仍然需要调用你想要的
init
方法。如果不想直接执行此操作,则需要知道方法的选择器,以便向对象发送正确的消息。选择器是消息签名的静态表示形式。您可以通过运行时API调用该方法,如下所示:

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){}
    }
id myObj = class_createInstance(NSClassFromString(@"MyClass"));
myObj = objc_msgSend(myObj, @selector(initWithStr1:str2:str3), myString1, myString2, myString3);
// Check myObj for nil which means a failed init.


ObjC运行时引用:

因此,如果我不知道类的构造函数/方法/选择器名称,那么即使我知道参数,我也无法调用它。是否存在某种查找,以根据可以采用的参数查找选择器。如果您知道这些参数,为什么不知道选择器?消息发送在Obj-C中是动态的,选择器是标识您正在调用的方法的东西。(这不像Java那样,你可以说“给我一个包含三个参数的命令”--可能有很多东西是以“init…”开头的,看起来像这样,你想知道你在调用哪个。)看看上面链接的运行时文档。您可以使用
class_copyMethodList
函数迭代方法,并检查它们的名称、选择器和参数等。我同意您的看法,我应该知道选择器名称,但是如果我将类设计为具有多个选择器(init)使用相同的名称但传递不同的参数类型。我怎样才能区分它们之间的区别?我希望我很清楚,谢谢你的帮助。你不能这样宣布一个班级;编译器不允许你这样做。一个方法不能与另一个方法同名,但参数类型不同。这就是为什么ObjC init方法的名称类似于
-initWithName:title:subtitle
-initWithDate:attributes:flags
。它们都接受3个参数,但名称不同,因此选择器也不同。您应该在这里提出一个新问题,详细说明您正试图实现的目标——您可能会得到一些惯用的ObjC设计帮助。