Освобождение объектов, возвращаемых методом - PullRequest
4 голосов
/ 09 августа 2009

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

Я пишу довольно много методов, которые следуют следующей схеме:

-(NSThing*)myMethod{

  NSThing *thing = [[NSthing alloc] init];
  // do some stuff with the thing
  return thing;
}

У меня вопрос, как мне справиться с выпуском этого объекта? Ясно, что я не могу выпустить это в методе.

Ответы [ 2 ]

13 голосов
/ 09 августа 2009

обычно вы бы автоматически выпускали его

-(NSThing*)myMethod{

  NSThing *thing = [[NSthing alloc] init];
  // do some stuff with the thing
  return [thing autorelease];
}
5 голосов
/ 09 августа 2009

Авто-релиз - это простой способ выйти из этого, как сказал newacct. Однако вы должны принять во внимание «право собственности» на объект, который вы возвращаете.

В Objective-C общее правило состоит в том, что любой метод с alloc, new или copy в его имени возвращает объект, который не является автоматически выпущенным, в то время как другие методы (например, методы класса) предварительно -авторизовать возвращаемый объект. Таким образом, эти три не эквивалентны с точки зрения авто-релиза (хотя компилятор может все-таки поработать над магией и все равно преобразовать их в строковые константы):

// Autoreleased
NSString *string1 = [NSString stringWithString:@"aString"];
NSString *string2 = [[[NSString alloc] initWithString:@"aString"] autorelease];

// NOT autoreleased
NSString *string3 = [[NSString alloc] initWithString:@"aString"];

Ваш код может использовать аналогичный подход, в котором вы учитываете, кому принадлежит возвращаемый объект. В приведенном вами конкретном примере метод - это alloc ing и init ing объекта, поэтому, как правило, вы несете ответственность за autorelease использование [sic] в вашем собственном методе. Однако, если бы вы написали метод, который принимает ранее существующий объект и каким-то образом модифицирует его, вы не будете владеть этим объектом и не будете нести ответственность за автоматическое освобождение возвращаемого объекта. (Это может привести к возникновению проблем в будущем, когда пул автоматического выпуска, которому принадлежит объект, истощается.)

Смотрите также (спасибо Питеру и Куинну в комментариях!):

...