У меня странная задача. Мне нужно получить массив, содержащий все функции объектного объекта c. Затем мне нужно определить, является ли каждая функция методом класса или нет. Затем мне нужно получить имена (предпочтительно NSString) каждого параметра и тип каждого параметра. Есть ли способ сделать это? Если нет, кто-нибудь знает, как получить доступ к ключам и значениям, закодированным в функции протокола NSCoding - (void) encodeWithCoder: (NSCoder *) aCoder; без использования NSKeyedArchiver? То, что я пытаюсь сделать здесь, - это отобразить список свойств, необходимых для инициализации объекта. Все мои объекты используют методы класса для инициализации. Я создаю редактор уровней, который позволяет мне редактировать свойства, которые отличаются между объектами, и мне не хочется писать функции getPropertyList и initWithProperties для каждого отдельного объекта, поскольку я уже это сделал, реализуя протокол NSCoding.Поиск функций в объекте C
ответ
Мне нужно получить массив, содержащий все функции объектного объекта 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
, чтобы выполнить их инициализацию.
Имена параметров могут быть выведены из селектора, к которому можно получить доступ, используя 'method_getName()'. Также '[NSString class]' возвращает тип 'Class',' object_getClass() 'ожидает параметр id. Вызов object_getClass() не требуется. – mttrb
Я бы сказал «догадался», а не «вывел» (поскольку они действительно могут быть чем-то вообще), но это хороший момент. –
Да, конечно, это было бы не идеально, но я считаю, что это лучший доступный. – mttrb
- 1. Указатели функций в объекте C
- 2. pde.exportОсобенности для функций в объекте?
- 3. поиск в объекте ICollection
- 4. Двумерный поиск массива в объекте c
- 5. поиск регулярного выражения в объекте c
- 6. Поиск пустых полей в объекте - C#
- 7. Простой поиск таблицы в объекте c
- 8. Поиск недвижимости в объекте
- 9. Поиск полей в объекте
- 10. Поиск медиафайлов в объекте
- 11. Поиск в объекте массива
- 12. Поиск поля в объекте
- 13. javascript | поиск в объекте
- 14. Полиморфизм в объекте C
- 15. Поиск функций в пакете
- 16. Использование функций C, определенных в общем объекте без переименования
- 17. Как использовать общий массив между вызовами функций в объекте C
- 18. Поиск свойств в объекте javascript
- 19. UITableView Поиск имени в объекте
- 20. Поиск тегов в объекте Angularjs
- 21. Поиск данных в объекте Javascript
- 22. Поиск подстроки в объекте NSString
- 23. Двоичный поиск в объекте JSON
- 24. Поиск в объекте внутри массива
- 25. Поиск изменений в объекте EF
- 26. Javascript/jQuery: поиск в объекте
- 27. Поиск функций winapi
- 28. Сохранение имен функций при хранении в объекте
- 29. Sequelize список функций на объекте
- 30. Поиск строк в строковом массиве в объекте c
В [Objective-C Runtime Reference] есть много функций «самонаблюдения» (http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html) , Однако выяснение того, как их использовать, - это упражнение для ученика. –