Предупреждение о назначении Obj-C с помощью метода Init - PullRequest
3 голосов
/ 16 июля 2009

У меня есть метод init, определенный как:

- (id)initWithX:(float)inX AndY:(float)inY
{
    if (self = [super init])
    {
        [self setX:inX andY:inY];
    }

    return self;    
}

Когда я использую этот метод, как это:

MyObject* myObject = [[MyObject alloc] initWithX:0.0 AndY:0.0];

Я получаю предупреждение: «предупреждение: инициализация из другого типа Objective-C»

Но что интересно, если я поменяю «AndY:» на «andY:» в сигнатуре метода, предупреждение исчезнет.

Почему это происходит? Конечно, наименование моего метода не должно влиять на тип возвращаемого значения ??


После еще небольшого исследования, изменив имя метода, используйте строчные буквы 'и Y', чтобы предупреждение не исчезло. Я очистил все цели, и восстановил, и предупреждение не показывало. Но он вернулся после очередной перекомпиляции. Одд.

Ответы [ 5 ]

4 голосов
/ 16 июля 2009

Это немного расплывчато без полного контекста кода, но я постараюсь ответить на ваш вопрос.

Именование селектора метода не должно влиять на его тип возвращаемого значения. Однако, если имена методов не совпадают (например, они называются -initWithX: andY: в @interface, но -initWithX: AndY: в @implementation), вы можете столкнуться со странными проблемами. Кстати, соглашение о включении какао для множественных селекторов состоит в том, чтобы начинать каждый фрагмент со строчной буквы.

2 голосов
/ 16 июля 2009

Я подозреваю, что, как и другие упоминали, вы назвали методы по-разному в интерфейсе интерфейса класса (блок @interface, вероятно, в файле .h) и реализации метода (внутри блока @implementation) , Когда компилятор Objective C встречает неизвестный метод, он предполагает, что входные аргументы имеют тип id (ссылка на объект). Таким образом, когда он встречает метод с использованием именования AndY:, он не распознает метод (селекторы чувствительны к регистру) и предполагает, что входные данные должны иметь тип id. Поскольку вы передаете входные данные типа float, вы получаете предупреждение. Очевидно, что когда метод распознается и компилятор знает, что входные данные имеют тип float, вы не получите предупреждение.

2 голосов
/ 16 июля 2009

Вы объявили это строчными буквами "и" в файле .h?

1 голос
/ 17 июля 2009

Здесь, кажется, что-то еще работает, и я не совсем уверен, что.

Я прочитал руководство по какао и разделы о методах именования, где говорится, что не следует использовать и связывать ключевые слова, спасибо Toon Van Acker за ссылку.

Я удалил «andY:», заменив его просто на «y:», и предупреждение исчезло, независимо от того, сколько операций очистки и перестройки я делаю.

Я до сих пор не понимаю, почему это может привести к тому, что компилятор выдаст предупреждение. Хотя это идет вразрез с рекомендациями по методам именования, сигнатуры методов совпадают в заголовке и реализации ...

1 голос
/ 17 июля 2009

Я подозреваю, что если бы вы назвали метод неправильно, вы бы получили другое предупреждение (initWithX: AndY: метод не найден).

Что такое объявление в заголовочном файле? Объявление метода как

- (NSObject*)initWithX:(float)inX AndY:(float)inY;

например, даст вам это предупреждение.

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