iphone NSString напрямую использовать причину утечки памяти?

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

  1. NSString *str = [[NSString alloc] initWithString:@"привет"]

  2. NSString *str = [NSString stringWithString:@"привет"];

  3. NSString *str = @"привет";

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

Спасибо

по пункту 1 да, нужно; по пункту 2 нет, не знаю

По пункту 3?


person Jack    schedule 28.09.2010    source источник


Ответы (2)


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

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

person Vladimir    schedule 28.09.2010

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

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

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

person Community    schedule 28.09.2010