Должны ли переменные метода быть освобождены? - PullRequest
1 голос
/ 07 января 2011

В Objective-C, если у меня есть метод

-(IBAction) didTouchSomething:(id)sender {
  NSString* test = [DataGetter read];

  if(test == nil) {
    do something
  }
}

Нужно ли мне выпускать тест или делать что-то еще с ним по памяти?Или это автоматически обрабатывается, когда метод заканчивается?

Ответы [ 2 ]

3 голосов
/ 07 января 2011

Вам нужно только выпустить вещи, которыми вы владеете, с помощью alloc, copy, new или keep. Проверьте Apple " Руководство по программированию управления памятью ". Очень понятно и полезно.

Указатель, который вы создаете, в любом случае освобождать не нужно. Только объект, на который он может указывать, но только в случаях, указанных выше.

2 голосов
/ 07 января 2011

В принципе:

Вы не вызываете метод с именем, содержащим «copy», «alloc», «new» или «get» ( CANG ) - поэтому вы не должны release test, потому что вы не владеете этим.

На практике:

Убедитесь, что +[DataGetter read] возвращает объект autorelease d.

Пример:

+(NSString *)read
{
   NSString *result = [NSString stringWithFormat:@"Homedir: %@", [@"~" stringByExpandingTildeInPath]];
   return result;  // Correct: You don't own "result", so you can return it as is
}
// Alternate implementation 1:
+(NSString *)read
{
   NSString *result = [[NSString alloc] initWithFormat:@"Homedir: %@", [@"~" stringByExpandingTildeInPath]];
   return result; // Wrong: You own "result" since you created it!
}
// Alternate implementation 2:
+(NSString *)read
{
   NSString *result = [[NSString alloc] initWithFormat:@"Homedir: %@", [@"~" stringByExpandingTildeInPath]];
   return [result autorelease]; // Correct: calling autorelease ensures that result is going to be released later on.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...