Должен ли я сохранить параметр указателя объекта в каждом методе? - PullRequest
3 голосов
/ 26 августа 2011

Я пытаюсь освоить сохранение / освобождение. Я понимаю, что они соответствуют друг другу. Но я не знаю, когда мне нужно сохранить ссылки.

-(void)sampleMethod:(RandomClass *) obj {
    [obj  retain];
    // Do stuff to object...
    [obj release];
}

Необходимо ли сохранять (и, следовательно, освобождать) объект?

Я беспокоюсь о том, чтобы obj ушел. Из этого следует, что вы должны (если) сохранить эталонные параметры как можно скорее в функции? Как насчет промежутка времени между вызовом функции и первой инструкцией функции?

Спасибо!

Ответы [ 2 ]

5 голосов
/ 27 августа 2011

краткий ответ; используйте ARC.

Ответ Джо более или менее правильный. Пока это не так.

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

Рассмотрим:

NSString *foo = [aMutableArray objectAtIndex: 5];
[aMutableArray removeObjectAtindex: 5];
[someTextField setTextValue: foo];

БУМ!

Ваш код только что упал. Возможно (не произойдет сбой, если foo окажется константной строкой или случится , чтобы быть сохраненным чем-то другим, или случится , чтобы быть сохраненным / Авто-релиз где-то еще).

Технически это должно быть:

NSString *foo = [aMutableArray objectAtIndex: 5];
[foo retain];
[aMutableArray removeObjectAtindex: 5];
[someTextField setTextValue: foo];
[foo release];

То есть foo следует сохранять в тот момент, когда он входит в область действия и освобождается в тот момент, когда он больше не используется в области действия. Или вы можете [[foo retain] autorelease];, но может возникнуть проблема с автоматическим сбросом давления (обычно это не так, но может быть).

ARC выполняет этот вид анализа и обеспечивает сохранение foo, как показано выше, когда это необходимо.

5 голосов
/ 26 августа 2011

Вам не нужно беспокоиться о том, что передаваемый объект исчезнет, ​​поэтому нет необходимости его удерживать.Правильное управление памятью * гарантирует, что объект будет жить в течение вашего метода, потому что он будет находиться в том же потоке, что и вызывающий объект, поэтому пул автоматического освобождения для этого потока не должен сливаться, и вызывающий объект не может освобождать объект до тех пор, пока ваш методвернулся.Это справедливо даже для таких методов, как executeSelectorInBackground, поскольку они сохранят аргумент.

* Надлежащее управление памятью - это означает, что каждый поток, использующий автоматически освобожденные объекты, получает собственный пул автоматического выпуска, который используется в том же самомконтекст, в котором он создан, и объекты, переданные между потоками, правильно сохраняются.

...