Есть ли причина объявлять ivars, если вы используете свойства исключительно в Objective-C? - PullRequest
9 голосов
/ 05 февраля 2011

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

У меня вопрос: есть ли веская причина когда-либо объявлять ivars в интерфейсе класса? Я предпочитаю, чтобы мои общедоступные интерфейсы были минимальными и чистыми, насколько это возможно, раскрывая только те аспекты моего класса, которые уместны.

Например, я бы хотел сделать следующее:

MyClass.h

@interface MyClass : NSObject

@property (nonatomic, copy) NSString * publicString;
@property (nonatomic, copy, readonly) NSString * readOnlyString;

@end

MyClass.m:

@interface MyClass ()

@property (nonatomic, copy, readwrite) NSString * readOnlyString;
@property (nonatomic, copy) NSString * privateString;

@end

@implementation MyClass

@synthesize publicString = publicString_;
@synthesize readOnlyString = readOnlyString_;
@synthesize privateString = privateString_;

- (void)init
{
    self = [super init];

    if (self != nil)
    {
        self.publicString = @"Public String";
        self.readOnlyString = @"Read-Only String";
        self.privateString = @"Private String";
    }

    return self;
}

- (void)dealloc
{
    [publicString_ release];
    [readOnlyString_ release];
    [privateString_ release];

    [super dealloc];
}

@end

За исключением настроек стиля кода, есть ли какие-либо проблемы с обходом использования иваров, как это?

Ответы [ 4 ]

7 голосов
/ 05 февраля 2011

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

3 голосов
/ 05 февраля 2011

Основная проблема, если вас это вообще беспокоит, заключается в том, что для Какао с любовью динамические переменные экземпляра, такие как те, которые вы используете, не поддерживаются средами выполнения, отличными от 64-битных IntelPowerPC (исправлено согласно комментарию Чака ниже) и ARM (для iOS).

В настоящее время я не могу найти авторитетный документ Apple по этому вопросу;обратите внимание, что ограничения на последнюю OS X, v10.6, недостаточно, поскольку она доступна и поддерживается на 32-битных машинах Intel, которые Apple поставляла сразу после переключения с PowerPC.

Позднее дополнительное размышление: не зная оЛюбые потенциальные изменения в Xcode 4, хорошая причина объявить в противном случае частные переменные экземпляра в файле заголовка, чтобы пометить их как IBOutlets и подключить их графически.Это действительно относится только к очень специфическому типу класса и переменной-члена, хотя, по общему признанию.

1 голос
/ 07 апреля 2011

Я должен согласиться с LucasTizma по вопросу отладки.

Когда я начал использовать XCode4, я не стал явно объявлять ivars и позволял создавать их для меня с использованием синтаксиса @ synthesize aVar = _aVar . При попытке отладки кода я заметил, что не могу навести курсор на переменную и увидеть ее значение.

Для меня это просто недопустимо. Я полагаю, что они снова объявили их явно.

0 голосов
/ 05 февраля 2011

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

...