приборы, показывающие утечки NSPlaceholderstring - PullRequest
4 голосов
/ 27 декабря 2010

Я пытаюсь уменьшить утечки памяти в своем приложении, поэтому я использовал инструменты, чтобы найти все утечки.Мне удалось удалить почти все утечки, кроме очень раздражающей.

Инструменты говорят мне, что у меня много утечек NSPlaceholderstring.Код, который вызвал утечку (в соответствии с приборами):

if (nil == storedHash) 
{
  NSString *description = [[NSString alloc] initWithFormat:@"1 = %@ 2= %d", uId, service];
  self.storedHash = description; // This line is the leak according to instruments

  [description release];
  description = nil;
}

return storedHash

StoreHash определяется следующим образом:

@property(copy) NSString* storedHash;

Я перепробовал все, что мог придумать:

  • Я использовал retain вместо copy
  • Я использовал автоматическое выделение NSString (stringWithFormat)
  • Я попытался обернуть код пулом авто-релизов

Ничто из вышеперечисленного не изменило утечки.(В некоторых случаях тип утечек изменяется, но все еще есть утечки)

Идеи кому-нибудь?

Ответы [ 3 ]

5 голосов
/ 27 декабря 2010

Где вы выпускаете storedHash? Вы выпускаете это в dealloc?

Обратите внимание, что NSPlaceholdeString - это деталь реализации; это класс экземпляра, возвращаемый методом NSString +alloc.

0 голосов
/ 28 декабря 2010

Вы должны использовать

@property(nonatomic, retain) NSString* storedHash;

вместо копирования. @property(copy) не выпустил ваш старый объект NSObject, и вы должны сделать это самостоятельно:

if (nil == storedHash) 
{
  NSString *description = [[NSString alloc] initWithFormat:@"1 = %@ 2= %d", uId, service];
  [self.storedHash release];
  self.storedHash = description; // This line is the leak according to instruments

  [description release];
  // description = nil; // it's unnecessary
}

также вы должны выпустить сохраненный хэш в dealloc.

0 голосов
/ 27 декабря 2010

Как насчет метода dealloc? Вы выпустили хранимый хэш в методе dealloc? А как насчет проверки if (nil == self.storedHash)

...