Цель-C: Должен ли я объявить частные методы? - PullRequest
8 голосов
/ 20 июля 2011

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

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

Так, я должен даже потрудиться объявить закрытые методы в расширениях класса?

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

Ответы [ 3 ]

10 голосов
/ 20 июля 2011

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

-(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
{
}
5 голосов
/ 28 июня 2012

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

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

2 голосов
/ 20 июля 2011

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

- (void)foo {
}

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

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

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

- (void)foo {
}

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

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

...