iphone NSString напрямую использовать вызывают утечки памяти? - PullRequest
2 голосов
/ 28 сентября 2010

Для NSString мы можем использовать

  1. NSString * str = [[NSString alloc] initWithString: @ "hi"]

  2. NSString * str = [NSString stringWithString: @ "hi"];

  3. NSString * str = @ "hi";

Может кто-нибудь, пожалуйста, сказал мне в форме пункта 3, является ли str собственным @ "привет"? Я имею в виду, нужно ли мне [str release] очищать?

Спасибо

для пункта 1, да, мне нужно; для пункта 2 нет, я не

Для пункта 3?

Ответы [ 2 ]

3 голосов
/ 28 сентября 2010

Нет, вам не нужно выпускать его.

Строковый литерал (это то, что у вас есть в случае 3) создается во время компиляции, а его время жизни - это время жизни вашего приложения. Вы также можете легко проверить, что операции деблокирования / сохранения не влияют на их счет сохранения (попробуйте свойство NSLog retainCount, и вы увидите это)

2 голосов
/ 28 сентября 2010

Принимая каждый случай и применяя стандартные правила управления памятью:

  1. Вы использовали метод +alloc, поэтому вы являетесь владельцем этого объекта. Вы должны отпустить или автоматически выпустить его.
  2. Вы не использовали методы +alloc, +new или -copy. Вы не являетесь владельцем этого объекта, поэтому ваш код не должен его освобождать.
  3. Так же, как 2 - вы не выделяли и не копировали этот объект, вы не являетесь его владельцем, вы не должны его освобождать.

Обратите внимание, что вместо обработки строковых литералов как магических объектов, если вы обращаетесь с ними точно так же, как с любым другим объектом, и применяете точно такие же правила в отношении владения и управления памятью, ваш код будет работать.

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