Использование Assign уменьшает объем используемой памяти?
Когда я использую assign
объявляя синтезированную собственность, ARC автоматически все еще создает соответствующий ivar к этому? Моя собственность выглядит следующим образом
@property (nonatomic, assign) NSString *text:
А также
- (NSString *)text {
return self.label.text; // label is a UILabel
}
- (void)setText:(NSString *)text {
self.label.text = text;
}
Я никогда не пользуюсь автоматически сгенерированным _text
Ивар; компилятор все еще создает этот ivar, когда я опускаю @synthesize text = _text
или неиспользованный ивар просто сохраняется в памяти неиспользованным?
3 ответа
Не использовать assign
сюда. Это, вероятно, не будет иметь значения в данном конкретном случае, но это крайне запутывает вызывающего, и это приведет к очень серьезным ошибкам, если вы когда-нибудь измените реализацию.
Тот факт, что вы реализовали getter и setter, означает, что компилятор не будет генерировать ivar. Это не имеет никакого отношения к тому, какой атрибут управления памятью вы используете. использование strong
здесь, потому что это то, что вы реализовали. Ваш заголовок должен соответствовать вашей реализации.
Вы беспокоитесь о 4-8(32/64 битных указателях) байтах дополнительных выделений на экземпляр? Использование назначить, слабый или сильный сильный не изменит след памяти. Независимо от того, что вы используете, строка не копируется, ссылка всегда указывает на один и тот же экземпляр. Разница лишь в том, что асси-слабые не увеличивают количество ссылок на объект, поэтому, опуская ивар, вы "экономите" только 4-8 байт в зависимости от используемой вами архитектуры.
IVAR создается автоматически для вас, только если вы не реализовали свою собственность самостоятельно. И @synthesize text = _text;
выполняется автоматически, если вы не предоставите свою собственную реализацию для методов получения и установки или не синтезируете свойство для какой-либо другой переменной. Например:
@synthesize text;
Выше будет синтезировать text
собственность на text
переменная.
Что касается использования assign
вместо копирования это теоретически будет использовать меньше памяти, но в то же время опасно. Если вы используете изменяемые строки, если вы измените строковое значение после присвоения его свойству, значение свойства также изменится, что в большинстве случаев не то, что вам нужно.