Авто-релиз - это простой способ выйти из этого, как сказал 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] в вашем собственном методе. Однако, если бы вы написали метод, который принимает ранее существующий объект и каким-то образом модифицирует его, вы не будете владеть этим объектом и не будете нести ответственность за автоматическое освобождение возвращаемого объекта. (Это может привести к возникновению проблем в будущем, когда пул автоматического выпуска, которому принадлежит объект, истощается.)
Смотрите также (спасибо Питеру и Куинну в комментариях!):