2012-05-14 3 views
0

У меня странная задача. Мне нужно получить массив, содержащий все функции объектного объекта c. Затем мне нужно определить, является ли каждая функция методом класса или нет. Затем мне нужно получить имена (предпочтительно NSString) каждого параметра и тип каждого параметра. Есть ли способ сделать это? Если нет, кто-нибудь знает, как получить доступ к ключам и значениям, закодированным в функции протокола NSCoding - (void) encodeWithCoder: (NSCoder *) aCoder; без использования NSKeyedArchiver? То, что я пытаюсь сделать здесь, - это отобразить список свойств, необходимых для инициализации объекта. Все мои объекты используют методы класса для инициализации. Я создаю редактор уровней, который позволяет мне редактировать свойства, которые отличаются между объектами, и мне не хочется писать функции getPropertyList и initWithProperties для каждого отдельного объекта, поскольку я уже это сделал, реализуя протокол NSCoding.Поиск функций в объекте C

+2

В [Objective-C Runtime Reference] есть много функций «самонаблюдения» (http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html) , Однако выяснение того, как их использовать, - это упражнение для ученика. –

ответ

2

Мне нужно получить массив, содержащий все функции объектного объекта c. Затем мне нужно определить, является ли каждая функция методом класса или нет.

Простой: вы хотите class_copyMethodList(), что дает вам только методы экземпляра для этого класса. Чтобы получить методы класса, передайте объект класса, например. class_copyMethodList(object_getClass([NSString class]), &count);

Тогда мне нужно, чтобы получить имена (предпочтительно NSString) каждого параметра и тип каждого параметра принимает.

Возможно, имя параметра не указано. Они не включены в метаданные метода, и я уверен, что они вообще не выживают в компиляции; выкапывая их из исполняемого файла, если они там, конечно, нелегко.

типов, однако, легко доступны с помощью одной из двух функций времени выполнения: либо method_getTypeEncoding(), который получает вас signature string для возврата и аргументов метода, или method_getArgumentType(), который позволит вам петлю над типами аргументов (возврат строки используйте тот же код, что и полная строка).

Если нет, то кто-нибудь знает, как получить доступ к ключам и значения, закодированные в функции NSCoding протокола -(void)encodeWithCoder:(NSCoder*)aCoder без использования NSKeyedArchiver?

Вы говорите о конкретной реализации, которую вы сделали для encodeWithCoder:? Вы хотите, чтобы список ivars подразумевал [coder encodeObject:firstIvar forKey:@"firstIvar"]; [coder encodeObject:secondIvar forKey:@"secondIvar"];? Я не уверен, что это связано с сигнатурами методов, но если это так, вы можете создать подкласс NSCoder, который создает словарь, когда вы передаете его в качестве кодера, и отправьте encodeWithCoder: на свои объекты (см. this answer I posted на днях).

Что я пытаюсь сделать здесь, это отобразить список свойств, необходимых для инициализации объекта.

Как насчет метода класса, который возвращает массив с именами свойств?

+ (NSArray *)essentialPropertyNames { 
    return [NSArray arrayWithObjects:@"firstIvar", @"secondIvar", nil]; 
} 

Это, вероятно, будет меньше усилий, чем сбор метаданных времени выполнения/класса и не будет менее странным.

Все мои объекты используют методы класса для инициализации.

Это звучит необычно в лучшем случае. В какао экземпляры должны использовать некоторую форму -init, чтобы выполнить их инициализацию.

+0

Имена параметров могут быть выведены из селектора, к которому можно получить доступ, используя 'method_getName()'. Также '[NSString class]' возвращает тип 'Class',' object_getClass() 'ожидает параметр id. Вызов object_getClass() не требуется. – mttrb

+0

Я бы сказал «догадался», а не «вывел» (поскольку они действительно могут быть чем-то вообще), но это хороший момент. –

+0

Да, конечно, это было бы не идеально, но я считаю, что это лучший доступный. – mttrb

Смежные вопросы