Uni*_*nis 3 dynamic object objective-c instantiation
在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){}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在objective-c中做同样的事情,只知道要传递给objective-c类构造函数的参数类型.
提前致谢.
是的,取决于你真正在做什么.ObjC没有相同的语言级"构造函数" - 有一些init方法通常与alloc实例化方法一起调用,但请注意init框架约定而非spec,因此运行时不"知道"什么"构造函数"你想要调用.
您可以实例化一个对象(相当于分配它),如下所示:
id myObj = class_createInstance(NSClassFromString(@"MyClass"));
Run Code Online (Sandbox Code Playgroud)
虽然你可以更直接地做到这一点:
id myObj = [NSClassFromString(@"MyClass") alloc];
Run Code Online (Sandbox Code Playgroud)
但是你仍然需要调用init你想要的任何方法.如果您不想直接执行此操作,则需要知道方法的选择器,以便向对象发送正确的消息.选择器是消息签名的静态表示.您可以通过运行时API调用该方法,如下所示:
myObj = objc_msgSend(myObj, @selector(initWithStr1:str2:str3), myString1, myString2, myString3);
// Check myObj for nil which means a failed init.
Run Code Online (Sandbox Code Playgroud)
ObjC运行时参考:http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html
| 归档时间: |
|
| 查看次数: |
1357 次 |
| 最近记录: |