Предупреждения избыточного компилятора

Я обнаружил, что очень часто при вызове myMethod, связанного с myObject1 из myObject2, я получаю предупреждение о том, что «myObject1 может не отвечать на -myMethod», но тогда программа все равно работает нормально. Почему компилятор не распознает объявленные методы во время компиляции?

Джон Донер


person John R Doner    schedule 12.12.2009    source источник
comment
Извините, я использую версию Objective-C для IPhone SDK.   -  person John R Doner    schedule 12.12.2009
comment
Ответ Дэйва, вероятно, правильный, но расплывчатый. Выложи код и сообщение об ошибке!   -  person bbum    schedule 12.12.2009


Ответы (5)


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

person Quinn Taylor    schedule 13.12.2009
comment
Это близко к описанию моей ситуации. Я вызываю методы представления из контроллера представления в синтаксисе [self.view myMethod]; Компилятору это не нравится, но программа работает нормально. Джон Донер - person John R Doner; 14.12.2009
comment
В этом случае вы, вероятно, могли бы вместо этого вызвать [(id)self.view myMethod] или просто [(id)view myMethod], если только ваше свойство -view не просто возвращает ваш ivar. - person Quinn Taylor; 15.12.2009

Это выглядит как предупреждение, потому что Objective-C — очень динамичный язык. Во время компиляции компилятор не нашел объявление для «myMethod» (возможно, вы пропустили файл заголовка или забыли включить его в заголовок?), когда он пытался скомпилировать файл. Однако это только сгенерировало предупреждение, потому что Objective-C имеет возможность создавать и загружать дополнительные методы во время выполнения, так что к моменту выполнения кода этот метод будет существовать. Следовательно, это только предупреждение.

Скорее всего, вы просто не объявили метод в соответствующем заголовочном файле.

person Dave DeLong    schedule 12.12.2009
comment
Что ж, я сделал все необходимые импорты и декларации. Но теперь, когда я думаю об этом, компилятор является однопроходным компилятором, поэтому, возможно, он скомпилировал оператор вызова метода до того, как он достигнет определения метода в связанном файле класса. Но похоже, что импорт файла .h в верхней части класса гарантирует, что методы этого класса будут распознаваться ниже, где они вызываются. - person John R Doner; 12.12.2009
comment
Однако это только сгенерировало предупреждение, потому что Objective-C имеет возможность создавать и загружать дополнительные методы во время выполнения. Что? нет. Он запускается только потому, что объект действительно поддерживает этот метод (он существует). Но вы получаете предупреждение, потому что статический тип объекта во время компиляции этого не доказывает. - person user102008; 24.01.2012

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

Если вы не объявили метод, сделайте это в блоке @interface в верхней части исходного файла (если это частный метод) или в заголовочном файле вашего класса (если это общедоступный метод).

Если вы объявили метод в заголовочном файле, обязательно импортируйте заголовочный файл.

Если вы объявили метод и импортируете правильный заголовочный файл, у вас где-то опечатка.

person Darren    schedule 12.12.2009

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

person RyanWilcox    schedule 12.12.2009

Обычно, добавляя

@class myObject1

решит проблему. Ознакомьтесь с ответом Бена Готлиба на Objective-C @class vs. #import здесь, в стеке. Переполнение.

person Elise van Looij    schedule 12.12.2009
comment
Боже, некоторым людям действительно не нравится этот ответ. Какая-то конкретная причина? - person Elise van Looij; 18.12.2009