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 требует этого, чтобы не добавлять дополнительный проход к компилятору (один для поиска функций, а затем один для фактического их анализа). Что касается того, следует ли вам объявлять их, когда это не необходимо, это действительно зависит от стиля кодовой базы, с которой вы работаете.
Как и для других языков, не требующих деклараций, некоторые просто идут с дополнительным проходом, в то время как другим не нужно знать количество и типы аргументов или тип возвращаемого значения во время компиляции (они ищут функции во время выполнения, или у них нет строго типизированных переменных, поэтому они не "важны" ), поэтому они могут просто пропустить его.