Основы NSString - память - сохранить - копировать - PullRequest
2 голосов
/ 02 февраля 2010

Вот мой код:

NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];

Теперь я беру другую строку, как показано ниже.

NSString *x2=[xyz copy];

Я не знаю точно, что здесь произойдет? Это что-то вроде, у x2 есть ссылка на ссылку из xyz?

NSString *x3=[xyz retain];

Что будет здесь, у x3 есть новая память, скопировавшая строку, или [xyz copy] это сделает?

Теперь, как удалить все эти три строки из памяти?

Ответы [ 2 ]

6 голосов
/ 02 февраля 2010
NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"];

Это создаст автоматически выпущенный экземпляр NSString - он будет освобожден при сливе пула автоматического выпуска (обычно при следующем цикле выполнения).

NSString *x2 = [xyz copy];

Теоретически -copy сообщение создаст новый экземпляр объекта с сохранением счетчика 1 (то есть вы должны освободить его где-то), но поскольку объект NSString неизменен, то [копия xyz] будет оптимизирована для [сохранения xyz] и, таким образом, он будет указывать на тот же экземпляр.

NSString *x3=[xyz retain];

x3 будет указывать на тот же экземпляр, что и xyz (и x2), и его счетчик хранения будет увеличиваться - вы должны выпустить ваш объект куда-нибудь.

Теперь, как удалить все эти три строки из памяти?

Убедитесь, что вы связываете все сохраняемые (копируемые) сообщения с выпуском и память освобождается.
Прочитайте Руководство по управлению памятью Objective-c для получения более подробной информации.

3 голосов
/ 02 февраля 2010

В такой ситуации особенно полезно ознакомиться с соглашениями / правилами именования сообщений, связанными с управлением памятью в target-c и какао (и связанных с ними структурах):

Вы вступаете во владение объектом, если вы создать его с помощью метода, имя которого начинается с «alloc» или «new» или содержит «копию» (например, alloc, newObject или mutableCopy), или если вы отправить это сообщение. Вы ответственный за отказ владение объектами, которыми вы владеете, используя выпуск или авто-релиз. В любое другое время Вы получаете объект, вы не должны отпустите это. ( Руководство по программированию управления памятью для какао )

следовательно, вы можете предположить, что каждый объект, который вы когда-либо получаете из сообщения, которое не названо в соответствии с схемой, изложенной выше, либо автоматически высвобождается, либо обрабатывается другими способами (это может быть общий объект, управляемый какой-то другой объект и т. д.)

Если вы просто помните об этом, на ваши вопросы можно быстро ответить:

  1. Вы получаете NSString * xyz из сообщения, имя которого не соответствует схеме, описанной в правиле выше (не выделено, не новое, не скопировано, не сохранено). Вы не должны выпускать его.

  2. Вы получаете NSString * x2 из сообщения с именем copy. Вы должны отпустить

  3. Вы получаете NSString * x3 из сообщения с именем retain. Вы должны отпустить.

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