Рекомендуется ли определять ивары для только что синтезированных свойств?
Я пришел к выводу, что во многих случаях, когда я хочу иметь синтезированное свойство только для чтения, я просто реализую метод получения этого свойства в терминах других переменных, например, без необходимости использования ивара (Примечание: я определяю 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
имеет два возможных эффекта:
Он добавляет переменную экземпляра с именем
_options
Если у вашего класса его нет.Он генерирует метод получения,
options
, который возвращает значение_options
, если в вашем классе нет метода с именемoptions
,
Поскольку вы вручную определили переменную экземпляра и метод получения, @synthesize
ничего не делает. Вы можете удалить его полностью, не меняя смысла вашей программы.
Определение copy
на свойство только для чтения не влияет. copy
а также retain
(или, точнее, под ARC, strong
) атрибуты влияют только на сгенерированный метод setter, а компилятор не генерирует setter для readonly
имущество. (Если вы измените свойство на readwrite
в расширении класса, то copy
вопросы.)
Да, _options
ivar занимает обе памяти (для каждого экземпляра Editor
) и пробел в таблице символов. Поскольку вы не используете _options
ivar, вы должны полностью удалить его. Вы также должны удалить @synthesize
полностью, поэтому компилятор не генерирует _options
ивара для тебя.