2009-07-16 3 views
3

я метод инициализации определяется как:Obj-C Назначение Предупреждение При инициализации метода

- (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», чтобы предупреждение не исчезло. Я очистил все цели и перестроил, и предупреждение не показывалось. Но он вернулся после очередной перекомпиляции. Странный.

ответ

1

Здесь, как представляется, здесь что-то есть, и я не совсем уверен, что.

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

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

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

2

Вы объявили его строчным «и» в вашем файле .h?

4

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

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

+2

Кроме того, руководство Apple по кодированию с использованием «и» для подключения аргументов как в andY: (int) intY «Не использовать» и «связывать ключевые слова, являющиеся атрибутами получателя». http://developer.apple.com/documentation/Cocoa/Conceptual/CodingGuidelines/Articles/NamingMethods.html –

+0

Отличный момент! Я забыл об этом, но это отличный совет. –

+0

Это было первое, что я проверил, но это не проблема. Декларация в интерфейсе идеально соответствует определению в реализации. Подпись метода, используемая в интерфейсе: - (id) initWithX: (float) x AndY: (float) y; – Jasarien

2

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

1

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

Какая декларация возвращается в файл заголовка? Объявление метода как

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

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

+0

подпись возвращает идентификатор. - (id) initWithX: (float) x andY: (float) y; – Jasarien

Смежные вопросы