Вызов унаследованного метода вызывает предупреждение без приведения к суперклассу - PullRequest
2 голосов
/ 22 августа 2011

У меня есть следующее дерево наследования:

NSObject <- GameObject <- RenderableObject <- SimpleBullet

GameObject имеет метод с именем bounds, который возвращает границы объекта. В моем коде у меня есть SimpleBullet, который вызывает bounds, чтобы получить свои границы, и я получаю предупреждение о том, что bounds определено в нескольких местах; странный. Если я приведу SimpleBullet к GameObject и вызову метод bounds, все будет работать как положено. Что происходит? Я не могу понять это поведение. Пример:

SimpleBullet* bullet = bulletInstance;
[bullet bounds];    // we get the warning.
[(GameObject*)bullet bounds];    // works as expected.

Как я уже сказал, метод bounds определен в GameObject, но почему Obj-C не знает, что SimpleBullet является GameObject, и не позволяет мне вызывать его метод без предупреждения?

Ответы [ 2 ]

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

После некоторого расследования мне удалось узнать, что происходит.Компилятор подшучивал, потому что не сообщал о серьезной ошибке.Проблема была в том, что я не импортировал / не включал SimpleBullet.h.Было объявлено предварительное объявление, но не реальная реализация.

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

Спасибо за помощь.

1 голос
/ 22 августа 2011

UIView также имеет метод -bounds. Убедитесь, что ваш метод имеет тот же тип возврата.

...