Лучший способ определить частные переменные в Objective-C
Я хочу определить переменные частного экземпляра в файле MyClass.m. Мне кажется, есть два способа сделать это:
-
использовать расширение класса
@interface HelloViewController ()
{
int value;
}
-
определить в разделе @implementation
@implementation HelloViewController
{
int value;
}
Что лучше?
Я думаю, что недавний стиль кодирования Apple заключается в использовании расширения класса?
например. MasterViewController.m, сгенерированный "Шаблон приложения Master-Detail"
@interface MasterViewController () {
NSMutableArray *_objects;
}
@end
Ответы
Ответ 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