Это правильная ситуация для вызова release для объекта в Objective-C? - PullRequest
0 голосов
/ 12 октября 2011

Я новичок в Objective-C и у меня возникли некоторые трудности с пониманием управления памятью.

Итак, допустим, у меня есть класс и переменная экземпляра типа NSString *, которая не привязана кимущество.Будет ли утечка памяти в этой ситуации?

myString = [[NSString alloc] init]; 
//more program stuff
myString = [[NSString alloc] init];

Должен ли я вызвать [myString release], прежде чем установить myString равным новому объекту?Будет ли такого рода код утечки памяти?Должен ли я отпускать такой объект каждый раз, когда у меня есть указатель на другой объект?

Ответы [ 4 ]

2 голосов
/ 12 октября 2011

В будущем придерживайтесь простого правила, что для каждого alloc / copy / retain вы должны связать его с release.

2 голосов
/ 12 октября 2011

Во-первых, Apple Руководство по программированию управления памятью - отличное место для поиска примеров и инструкций по управлению памятью.

Теперь к вашему вопросу.Когда вы вызываете myString = [[NSString alloc] init];, вы переназначаете указатель myString и, таким образом, теряете доступ к исходному NSString, что приводит к утечке памяти.

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

myString = [[NSString alloc] init]; 
// ...
myString = [[NSString alloc] init];
// ...
[myString release];
[myString release];

, вы дважды отпустите один и тот же экземпляр, что приведет к перевыпуску и ошибке BAD-ACCESS.Правильнее всего сделать

myString = [[NSString alloc] init]; 
// ...
[myString release];
myString = [[NSString alloc] init];
// ...
[myString release];

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

1 голос
/ 12 октября 2011

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

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

1 голос
/ 12 октября 2011

Да, это будет утечка.

При выделении и назначении другого экземпляра NSString той же переменной myString вы теряете ссылку на исходное содержимое myString и, следовательно, возможность отправлять ему сообщение о выпуске.Статический анализатор Clang и прибор для обнаружения утечек должны обнаружить эту утечку.

...