Xcode 4 / LLVM 3.0 - сделать это немного умнее об ошибках "нет известного метода экземпляра для селектора"? - PullRequest
3 голосов
/ 03 августа 2011

Следующий код совершенно безопасен, но Xcode 4 выдает ошибку:

    if ([self respondsToSelector: @selector(foo)])
        [self foo];

Я знаю, что могу обойти это с помощью фиктивного протокола, но я использую этот шаблон довольно часто, и такое количество работы не требуется. Есть ли способ установить настройку где-нибудь, желательно один раз, чтобы эта «ошибка» больше не вызывала у меня проблем?

Ответы [ 2 ]

4 голосов
/ 03 августа 2011
if ([self respondsToSelector: @selector(foo)])
    [self foo];

Это выражение только"совершенно безопасно", если нет аргументов и нет возвращаемого значения.Если требуется какая-либо информация о типе, @selector(foo) недостаточно.

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

То есть ваш пример fooWithInteger: и / или fooWithX:y:z: может не может быть скомпилирован правильнобез полной информации о типе, доступной из-за капризов языка C и специфичного для архитектуры ABI.

Кроме того, чтобы компилятор мог компилировать это без предупреждения, потребуется компилятор для слияния выражения времени выполнения - respondsToSelector: должен быть динамически отправлен - с выражением времени компиляции.Компиляторы ненавидят это.

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

Чтобы отключить компилятор, когда следует такой схеме, я использую -performSelector:

if ([self respondsToSelector:@selector(foo)]) {
    [self performSelector:@selector(foo)];
}

Я не знаю других способов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...