Мертвый магазин и потенциальная утечка NSString в Xcode - PullRequest
0 голосов
/ 09 августа 2011

бит строки один.Я продолжаю получать уведомления о мертвых хранилищах и потенциальной утечке при использовании следующего кода (упрощенного для примера):

int x = 0;
NSString *aString = [NSString alloc]init]; <-- value store to 'aString' during its     initialization is never read

if(x == 0)
{
  aString = @"This is a string set by x being 0";
} else
{
  aString = @"This is a string set by x being something else";
}

aTextLabelOutlet.text = aString;
[aString release];
<-- Potential leak of an object allocated online ... and stored into aString

Я действительно не понимаю этого.Он выделяется один раз, а затем освобождается после использования.Инициализируется, затем всегда что-то вкладывается в него и всегда читается.

Он никогда не падает или фактически вызывает утечку памяти, поэтому я немного запутался.

Ответы [ 2 ]

6 голосов
/ 09 августа 2011

Вы не должны выделять NSString для aString, поскольку вы присваиваете aString в части if.

Этого должно быть достаточно:

int x = 0;
NSString *aString;

if(x == 0)
{
  aString = @"This is a string set by x being 0";
} else
{
  aString = @"This is a string set by x being something else";
}

aTextLabelOutlet.text = aString;
0 голосов
/ 15 января 2012

Проблема в том, что вы выделили строку NSString, но затем вы не освобождаете ее. Вы пытаетесь освободить строку, назначенную вами с кодом aString = @"...".

Поскольку первое присваивание aString никогда не используется, вам не нужно давать aString значение, как отмечено в другом ответе (который также не выполняет освобождение, поскольку строки являются статически распределенными константами)

Если строка имеет использованное значение, вам следует поменять местами назначение и освободить. например,

int x = 0;
NSString *aString = [NSString alloc]init]; <-- value store to 'aString' during its     initialization is never read

// do something with aString
[aString release];

if(x == 0)
{
  aString = @"This is a string set by x being 0";
} else
{
  aString = @"This is a string set by x being something else";
}

aTextLabelOutlet.text = aString;

Или я буду использовать автоматически выпущенную строку, чтобы во время выполнения выполнялось освобождение, т. Е.

NSString *aString = [[[NSString alloc]init]autorelease];

или лучше использовать один из методов класса constructer

NSString *aString = [NSString string];
...