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

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

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

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

Зачем вообще нужно объявлять методы? В Java этого нет ... ни в Ruby.


person ma11hew28    schedule 20.07.2011    source источник
comment
Ну, вы не можете получить xcode для методов автозаполнения, если не объявите их.   -  person thelaws    schedule 20.07.2011


Ответы (3)


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

-(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
{
}
person Joe    schedule 20.07.2011
comment
Не совсем категория и расширение немного отличаются. В расширении вы можете добавить ivars, и компилятор будет стонать, если вы не реализуете методы, которые объявляете в расширении. Я уверен, что есть и другие отличия, но я пользуюсь ими. - person Paul.s; 20.07.2011
comment
Расширения классов не позволяют добавлять iVars, но разница между ними заключается в том, что методы расширения должны быть реализованы в основной @implementation, где это не категория. - person Joe; 20.07.2011
comment
Нет, вы можете добавить ivars в расширение, которое я использую постоянно. Расширение объявляется без каких-либо скобок между скобками, как эта @interface UIViewController (), где в качестве категории есть что-то между скобками, подобное этой @interface UIViewController (myCategory). В книге рецептов iOS упоминается этот метод - я не могу отследить его в документах Apple в мин. - person Paul.s; 21.07.2011
comment
Я только что снова проверил на собственное здравомыслие, и нет, это не работает в расширении! Но это использует компилятор LLVM GCC 4.2, более новый LLVM 2.0 поддерживает это. Все мои существующие проекты использовали компилятор GCC :) - person Joe; 21.07.2011

На этот ответ уже правильно ответил Джо для Xcode до версии 4.3. Однако в v4.3 и выше не только не нужно объявлять частные методы, но и порядок объявления теперь не имеет значения. Подробнее см .:

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

person ravron    schedule 28.06.2012

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

- (void)foo {
}

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

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

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

- (void)foo {
}

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

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

person Anomie    schedule 20.07.2011