Что происходит со свойством, если его значение перезаписывается? - PullRequest
1 голос
/ 18 июня 2011

Предположим, я создал свойство tempStr типа NSString. Я синтезировал это очевидно.

В одном из моих методов я установил значение tempstr в желтый цвет. Затем, сразу после этого, я повторно инициализировал tempStr с помощью redcolor.

Так что я хочу знать, что происходит с памятью tempStr в этом случае.

Thanx.

Ответы [ 2 ]

2 голосов
/ 18 июня 2011

Это зависит от того, какой атрибут вы задали для своего свойства: retain, assign или copy.

  • @property (retain) NSString *tempStr: будет выпущено старое значение (желтый цвет) иновое значение (красный цвет) будет сохранено.Единственное исключение - когда yellowcolor == redcolor.Тогда ничего не произойдет, потому что старые и новые значения совпадают.
  • @property (assign) NSString *tempStr: не будет никаких операций отпускания / сохранения.Это равносильно изменению только указателя.Таким образом, после этих операций желтый цвет не будет выпущен, и вы потеряете ссылку на него (если в вашем коде нет другой ссылки на него).Таким образом, это может вызвать утечку памяти.
  • @property (copy) NSString *tempStr: это похоже на retain, но оно вызывает copy для нового значения вместо просто retain, так что это создаст дублированный объект вобъем памяти.С учетом NSString он равен retain, поскольку NSString является неизменным, поэтому создавать дубликаты не нужно.

Некоторые примеры кода можно найти здесь .

EDIT : Как упоминалось @Bavarious, copy равно retain, только если вы инициализируете это свойство с NSString.Это не будет равно, если вы инициализируете его с NSMutableString, потому что это изменчивое, поэтому будет сделана «правильная» копия.

1 голос
/ 18 июня 2011

Синтезированный сеттер выглядит примерно так:

- (void)setSomeString:(NSString *)newString
{
   if ([newString isEqualToString:someString]) return;

   [someString autorelease];
   someString = [newString copy]; // or [newString retain], depends how you defined the property ...
}

Таким образом, старое значение освобождается, когда новое значение назначено указателю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...