Выпускать локальные переменные перед возвратом? - PullRequest
5 голосов
/ 17 февраля 2010

В target-c я понимаю, что вам нужно выпустить все, что вы инициализируете / сохраняете / копируете. Нужно ли это делать до return заявления? Я хочу понять вызов release явно и не использовать autorelease.

-(void) someMethod
{
  AnotherClass* ac = [[AnotherClass alloc] init];
  if([ac somethingHappens]){
    // Do I need to release ac here?
    return;
  }
  [ac doSomethingElse];
  [ac release];
}

Спасибо!

Ответы [ 2 ]

3 голосов
/ 17 февраля 2010

Да, вам нужно освободить переменные, однако вы выходите из метода.

Это довольно просто: когда вы инициируете что-то, счетчик приращений увеличивается. Когда вы отпускаете, это уменьшается. Когда он достигает нуля, он автоматически освобождается (освобождается).

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

2 голосов
/ 22 июля 2011

Предположим, что локальная переменная назначена так:

NSString *placeHolder = [NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]];

Теперь передайте эту переменную объектному методу, например, setPlaceholder объекта UISearchBar

[self.theSearchBar setPlaceholder:placeHolder];

Как правильно освободить назначенную строку placeHolder?

Если вы полагаете, что autoreleas это:

NSString *placeHolder = [[NSString stringWithFormat:@"%@ %@",[someObject value1], [someObject value2]] autorelease];

ваш код завершится с ошибкой bad_exc_access

Если вы думаете выпустить переменную после передачи в другое место, например

[self.theSearchBar setPlaceholder:placeHolder];
[placeHolder release];

исключение будет также выдано во время выполнения.

Так что не так?

Проблема в сохранении счета. Объект UISearchBar еще выделен, поэтому, если вы освобождаете или автоматически освобождаете такую ​​переменную, на которую ссылается этот объект, то счетчик сохранений остается тем же

NSLog(@"Retain count before assign to refer other object %d", [placeHolder retainCount]);
[self.theSearchBar setPlaceholder:placeHolder];
NSLog(@"Retain count after referencing %d", [placeHolder retainCount]);

Итак, как с этим справиться?

Попробуйте что-то вроде следующего

[placeHolder retain]; // retainCount +1
[self.theSearchBar setPlaceholder:placeHolder];
[placeHolder release]; // retainCount -1

Что мы сделали, чем? Давайте теперь посмотрим на счет удержания

NSLog(@"Retain count before doing retain %d", [placeHolder retainCount]);
[placeHolder retain]; // retainCount +1
NSLog(@"Retain count after retaining it %d", [placeHolder retainCount]);

Итак, мы увеличили счетчик сохранности перед тем, как присвоить его (получить ссылку на) какому-либо объекту, а после этого - локально этой переменной.

Вот и все.

...