Подтвердить что ты не робот

Лучший способ определить частные переменные в Objective-C

Я хочу определить переменные частного экземпляра в файле MyClass.m. Мне кажется, есть два способа сделать это:

  • использовать расширение класса

    @interface HelloViewController ()
    {
         int value;
    }
    
  • определить в разделе @implementation

    @implementation HelloViewController
    {
        int value;
    }
    

Что лучше?

Я думаю, что недавний стиль кодирования Apple заключается в использовании расширения класса?

например. MasterViewController.m, сгенерированный "Шаблон приложения Master-Detail"

@interface MasterViewController () {
    NSMutableArray *_objects;
}
@end
4b9b3361

Ответ 1

"Современный Objective-C" способ сделать это - объявить их в блоке реализации, например:

@implementation ClassName {
    int privateInteger;
    MyObject *privateObject;
}

// method implementations etc...

@end

Подробнее см. более подробно.

Ответ 2

@interface HelloViewController ()
{
    @private     //optional, this is old style
    int vale;
}

Если вы создавали библиотеку, теоретически никто не знал бы о каких-либо методах, которые вы не объявляли в файлах заголовков.

Скопировано из: Как создать реальную переменную частного экземпляра?


Объявление переменных экземпляра в @implementation является недавним особенность Obj-C, поэтому вы видите много кода с ними в @interface - другого выбора не было.

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

Переменные экземпляра, объявленные в реализации, неявно скрытый (фактически закрытый) и видимость не может быть изменена - @public, @protected и @private не создают ошибки компилятора (с текущий Clang как минимум), но игнорируются.

Скопировано из: Частного ivar в @interface или @implementation

Ответ 3

На мой взгляд, лучше всего определить его как частные свойства, к которым вы можете обращаться как к полям или свойствам только внутри вашей реализации. Преимущество заключается в том, что вы можете обращаться к ним как самостоятельно, так и с помощью синтаксиса _fieldName, что удобно в некоторых ситуациях.

@interface SignUpController ()
@property ViewHeaderView*header; //private properties/fields
@property UITextField*activeField;
@property CGFloat keyboardHeight;
@end

@implementation SignUpController {

}

@end