动态实例化对象Objective-C



在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类构造函数的参数类型?

是的,这取决于你真正在做什么。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

最新更新