Динамически создаваемый объект Objective-C - PullRequest
3 голосов
/ 24 октября 2011

В 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){}
    }

Есть ли способ сделать то же самое в target-c, зная только типы параметров, которые будут переданы конструктору классаjective-c.

Заранее спасибо.

1 Ответ

5 голосов
/ 24 октября 2011

Да, в зависимости от того, что вы действительно делаете. 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

...