Приватные методы в Objective-C, в Xcode 4.3, мне больше не нужно объявлять их в моем файле реализации? - PullRequest
15 голосов
/ 23 февраля 2012

У меня много вопросительных знаков над моей головой. Чего я не получил, так это до xcode 4.3, то мне нужно было объявить предварительные объявления (для закрытых методов) в моем файле реализации.

Как в моем .m файле:

// deleting this with xcode 4.3 the below code still does work 
// in previous versions i had to put this because otherwise the compiler can't find methodFirst
@interface DetailViewController ()
- (void)methodFirst;
- (void)methodSecond;
@end


@implementation DetailViewController

- (void) methodSecond
{
   // if i delete the forward declaration now adays i dont get a compiler error that he cant find method first
   [self methodFirst];
}

- (void) methodFirst
{
}

@end

Теперь, кажется, мне больше не нужно это делать? Apple обновила компилятор, чтобы больше не нужно было выдвигать декларации?

Я не могу найти ссылку на официальный источник Apple об этом изменении. Интересно, с чем столкнулись другие люди в их новой среде.

Ответы [ 2 ]

34 голосов
/ 23 февраля 2012

Начиная с версии компилятора LLVM, поставляемой с Xcode 4.3, если вы попытаетесь вызвать метод, которого компилятор ранее не видел, он будет искать в оставшейся части текущего блока @implementation, чтобы увидеть, был ли объявлен этот методпотом.Если так, то он использует это, и вы не получите предупреждение.Следовательно, начиная с Xcode 4.3, гораздо меньше необходимости предварительно объявлять ваши внутренние методы.Ясно, что вам все еще нужно объявить методы, которые публично доступны другим классам.

Это изменение было отмечено в примечаниях к выпуску некоторых бета-версий Xcode 4.3, но, очевидно, не вошло в «Что нового»в Xcode 4.3 "окончательная документация.

В отличие от того, что было предложено в других ответах, это не просто предупреждение" Undeclared Selector ", которое было отключено по умолчанию.Фактически, если вы используете ARC, нераспознанные селекторы все еще являются серьезными ошибками.Попробуйте позвонить [self myNonexistentMethod], и вы увидите;компилятор все еще жалуется.

5 голосов
/ 23 февраля 2012

В Objective-C нет никаких частных методов. То, о чем вы думаете, это продолжение класса, интерфейс безымянной категории, который вы можете объявить в своем файле .m для объявления методов. это будет в реализации класса, но не в общедоступном интерфейсе.

Никогда не было требования объявлять методы перед их использованием. Тем не менее, это всегда было хорошей идеей, и у компилятора есть флаг предупреждения, указывающий, когда используются методы, которые не были замечены. Причина в том, что это связано с соглашением о вызовах операционной системы для функций. Различные типы, такие как структуры, числа с плавающей запятой, целые числа и указатели, могут обрабатываться по-разному, когда они являются аргументами или возвращают значения из функций. Действительно, на разных компьютерах и в разных операционных системах они обрабатываются по-разному. Чтобы знать, как обрабатывать аргументы и возвращаемые значения для метода Objective-C, компилятору необходимо знать сигнатуру для этого метода: сколько аргументов каких типов он принимает и какой тип он возвращает.

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

...