Рекомендуется ли определять ивары для только что синтезированных свойств?

Я пришел к выводу, что во многих случаях, когда я хочу иметь синтезированное свойство только для чтения, я просто реализую метод получения этого свойства в терминах других переменных, например, без необходимости использования ивара (Примечание: я определяю ivars в интерфейсе, потому что я использую программное обеспечение OmniGraffle UML, и оно не распознает ivars, автоматически сгенерированный синтезированными свойствами):


@interface Editor : UIView {
    BOOL _wordWrap;
    BOOL _showLineNumbers;
    NSDictionary *_options;
}

@property (nonatomic) BOOL wordWrap;
@property (nonatomic) BOOL showLineNumbers;
@property (nonatomic, copy, readonly) NSDictionary *options;

@end

@implementation Editor

@synthesize wordWrap = _wordWrap;
@synthesize showLineNumbers = _showLineNumbers;
@synthesize options = _options;

- (NSDictionary *)options {
    return @{   
                @"WordWrap"         : [NSNumber numberWithBool:self.wordWrap],
                @"ShowLineNumbers"  : [NSNumber numberWithBool:self.showLineNumbers],
            };
}

@end

В выше Editor класс, необходимо ли мне определить _options ivar в определении заголовка и, что более важно, занимает ли автоматически сгенерированный ivar память или пространство в таблице символов? Кроме того, было бы более эффективно использовать copy, retainили нет значения в этом случае? Просто любопытно.

1 ответ

Решение

Во-первых: прекратите помещать свои декларации ivar в свой @interface, Они принадлежат твоему @implementation, Смотрите этот ответ для подробного объяснения.

В любом случае, учитывая то, что вы написали, ваш @synthesize options = _options не имеет никакого эффекта

Тот @synthesize имеет два возможных эффекта:

  1. Он добавляет переменную экземпляра с именем _optionsЕсли у вашего класса его нет.

  2. Он генерирует метод получения, options, который возвращает значение _options, если в вашем классе нет метода с именем options,

Поскольку вы вручную определили переменную экземпляра и метод получения, @synthesize ничего не делает. Вы можете удалить его полностью, не меняя смысла вашей программы.

Определение copy на свойство только для чтения не влияет. copy а также retain (или, точнее, под ARC, strong) атрибуты влияют только на сгенерированный метод setter, а компилятор не генерирует setter для readonly имущество. (Если вы измените свойство на readwrite в расширении класса, то copy вопросы.)

Да, _options ivar занимает обе памяти (для каждого экземпляра Editor) и пробел в таблице символов. Поскольку вы не используете _options ivar, вы должны полностью удалить его. Вы также должны удалить @synthesize полностью, поэтому компилятор не генерирует _options ивара для тебя.

Другие вопросы по тегам