Частные методы в Objective-C, в Xcode 4.3 Мне больше не нужно объявлять их в моем файле реализации?

У меня есть много вопросительных знаков толлинга над моей головой. То, чего я не получаю, до 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 об этом изменении. Интересно, что другие люди столкнулись в своей новой среде.

Ответ 1

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

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

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

Ответ 2

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

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

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