То, что вы сделали, будет работать.Вы можете retain
и release
объекты из любой выбранной вами области, при условии, что все это выравнивается (и объект освобождается, когда он больше не нужен любому другому объекту).
Но что выделают не принято.Если вы хотите, чтобы объект жил по истечении срока жизни метода (чтобы вы могли return
забрать его и получить его вызывающим методом), вам следует использовать autorelease
.
InВ вашем примере первый метод, вероятно, не должен сохранять владение строкой.Это должно выпустить это и позволить вызывающему абоненту поднять это.Но, конечно, если вы release
это в методе, он будет немедленно освобожден.Так что вместо этого вы можете autorelease
.При автоматическом его освобождении ваш первый метод говорит: «Мне больше не нужен этот объект и я оставляю свое право собственности, но, пожалуйста, немного подержите его в памяти, чтобы мой вызывающий мог сохранить его, если потребуется» .
Вот пример:
- (NSString *)createString {
/* Create a string. This method owns it. */
NSString *str = [[NSString alloc] init];
/* Autorelease it. This method does not own it, but wants it to stay in memory temporarily. */
[str autorelease]
/* Return it. It will stay in memory till the end of the current run loop */
return str;
}
- (void)viewDidLoad{
NSString *name = [self createString];
/* We now have a copy of the string. Nobody owns it. */
/* It is due to be released at the end of the current run loop. */
/* If we want to take ownership of it and prevent deallocation, we should retain it. */
[name retain];
}
Это поведение используется во всех API-интерфейсах Cocoa.Когда вы видите методы класса, которые возвращают новый объект, этот объект будет автоматически освобожден.Например, когда вы вызываете [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]
, вы просите класс NSArray создать для вас массив.Если существует вне метода arrayWithObjects:
, благодаря его статусу автоматического освобождения.Если вы не retain
это, он будет освобожден в конце текущего цикла выполнения.