Objective-C: Должен ли я объявлять частные методы?

Я объявляю частные методы в расширениях классов, в соответствии с Лучший способ определить частные методы для класса в Objective-C.

Но я просто понял, что в Xcode 4, если я вообще не использую объявление частного метода и просто его реализую, приложение компилируется и запускается без предупреждения или ошибки.

Итак, стоит ли даже объявлять частные методы в расширениях классов?

Почему мы должны объявлять методы в любом случае? В Java вы не... ни в Ruby.

Ответ 1

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

-(void)somemethod
{
}

-(void)callermethod
{
    //No warning because somemethod was implemented already
    [self somemethod];
}

-(void)callermethod2
{
    //Warning here if somemethod2 is not defined in the header or some extension
    [self somemethod2];
}

-(void)somemethod2
{
}

Ответ 2

Этот ответ уже правильно ответил Джо для Xcode до версии 4.1. Однако в v4.3 и выше не только частные объявления не должны быть объявлены, но порядок объявления теперь не имеет значения. Для получения дополнительной информации см.:

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

Ответ 3

Это будет компилироваться и работать нормально без объявления:

- (void)foo {
}

- (void)bar {
    [self foo];
}

Но последний раз я проверил, это даст предупреждение:

- (void)bar {
    [self foo];
}

- (void)foo {
}

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

Как и для других языков, не требующих деклараций, некоторые просто идут с дополнительным проходом, в то время как другим не нужно знать количество и типы аргументов или тип возвращаемого значения во время компиляции (они ищут функции во время выполнения, или у них нет строго типизированных переменных, поэтому они не "важны" ), поэтому они могут просто пропустить его.