Objective-C динамически создаваемые методы и предупреждения компилятора - PullRequest
3 голосов
/ 09 октября 2011

Если я динамически генерирую методы во время выполнения, а затем вызываю их - как я могу убедить компилятор, что класс будет реагировать на необъявленные (сгенерированные) методы и заставить его не выдавать предупреждения?

Обновление в отношении ответов

Когда я генерирую методы - их имя не известно во время компиляции. Чтобы привести пример - если у меня есть контроллер представления MyFooController и он инициирован методом initWithFoo:(Foo*)foo, я смогу сгенерировать метод, подобный pushMyFooControllerWithFoo:(Foo *)foo для UINavigationController. Следовательно, вы замечаете, что объявление таких методов было бы контрпродуктивным.

Ответы [ 4 ]

4 голосов
/ 09 октября 2011

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

[fooController performSelector:NSSelectorFromString(@"pushMyFooControllerWithFoo:") withObject:foo];

Таким образом, вы несете ответственность за достоверность созданных имен методов.

3 голосов
/ 09 октября 2011

Поскольку вы добавляете методы во время выполнения, вы должны также вызывать их с помощью функции времени выполнения, например, objc_msgSend или performSelector:withObject:, чтобы компилятор не собирался вас ничего предупреждать.

1 голос
/ 09 октября 2011

Ну, если вы позвоните им, вы знаете их подпись, и если вы знаете их подпись, вы можете объявить их, не так ли?

0 голосов
/ 09 октября 2011

Объявите этот метод в категории для NSObject и создайте пустую реализацию:

@interface NSObject (DynamicMethodsCategory)

- (void)doSomething;

@end

@implementation NSObject (DynamicMethodsCategory)

- (void)doSomething
{
}

@end

В вашем объекте вы можете вызвать его без каких-либо предупреждений:

@implementation MyObject

- (void)someMethod
{
    [self doSomething];
}

@end

Затем сгенерировать реализацию[MyObject doSomething] динамически, он будет вызываться вместо NSObject's one.

Обновление: в качестве альтернативы, метод может быть объявлен в категории для объекта.Это подавляет предупреждение о неполной реализации компилятора .Тем не менее, я думаю, что это не хороший обходной путь, потому что приложение будет аварийно завершать работу, если метод динамически не создается во время выполнения до его вызова.

...