Использование 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 вместо копирования это теоретически будет использовать меньше памяти, но в то же время опасно. Если вы используете изменяемые строки, если вы измените строковое значение после присвоения его свойству, значение свойства также изменится, что в большинстве случаев не то, что вам нужно.

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