Objective-C Найти все init (методы конструктора) - PullRequest
1 голос
/ 08 августа 2011

с помощью функции " Method * class_copyMethodList (Class cls, unsigned int * outCount) " можно получить список всех методов, существующих в классе Objective-C.

Я хотел бы знать, как найти, какой из этих методов является конструктором, когда я пишу контейнер IOC. Я хотел бы определить конструкторы и их типы параметров.

Ответы [ 2 ]

3 голосов
/ 08 августа 2011

Я хотел бы знать, как найти, какой из этих методов конструкторы, как я пишу контейнер IOC. я бы хотел определить конструкторы и их типы параметров.

Короче, ты не можешь. Или, по крайней мере, вы обнаружите, что по этому пути лежит безумие.

Во-первых, Objective-C не имеет конструкторов . У него есть инициализаторы, иногда много, и - для правильно написанного класса - только один из которых - обозначенный инициализатор . Невозможно определить назначенный инициализатор во время компиляции или во время выполнения.

Как я могу использовать это с Методом * и без экземпляра члена класс

Вы нет. Сначала вы выделяете экземпляр класса, а затем инициализируете экземпляр.

В целом, этот уровень абстракции просто не выполняется в Objective-C за пределами академических исследований. Это может быть сделано, но этого обычно избегают из-за хрупкости получающегося решения и шарика кода-ада, который пытается динамически поддерживать базовый C ABI (см. Исходный код libffi).

Если вы хотите пойти по этому пути, то вам гораздо лучше либо определить собственный абстрактный класс, который будет содержать подкласс всех ваших контейнеров, который может обеспечить логику привязки для класса, стоящего за ним.

или использовать протоколы; то есть класс может реализовывать протокол IOCBean, и один метод будет initIOCGoop, который является назначенным инициализатором goo.

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

0 голосов
/ 08 августа 2011

Вы можете получить сигнатуру метода, используя следующий метод:

methodSignatureForSelector:

Из документации:

Объект NSMethodSignature записывает информацию о типе аргументов и возвращаетценность метода.Он используется для пересылки сообщений, на которые принимающий объект не отвечает, особенно в случае распределенных объектов.Обычно вы создаете объект NSMethodSignature с помощью метода NSObject's methodSignatureForSelector: instance (в Mac OS X v10.5 и более поздних версиях вы также можете использовать signatureWithObjCTypes :).Затем он используется для создания объекта NSInvocation, который передается в качестве аргумента в forwardInvocation: сообщение для отправки вызова любому другому объекту, который может обработать сообщение.В случае по умолчанию NSObject вызывает didNotRecognizeSelector:, который вызывает исключение.Для распределенных объектов объект NSInvocation кодируется с использованием информации в объекте NSMethodSignature и отправляется реальному объекту, представленному получателем сообщения.

...