То, что вы сделали, будет работать. Вы можете retain
и release
объекты из любой области по вашему выбору, пока все это выравнивается (и объект освобождается, когда он больше не нужен для любого другого объекта).
Но то, что вы делаете, необычно. Если вы хотите, чтобы объект продолжал существовать в течение всего срока существования метода (чтобы вы могли return
и получить его от вызывающего метода), тогда вам следует использовать autorelease
.
В вашем примере первый метод, вероятно, не должен сохранять право собственности на строку. Он должен отпустить его и позволить вызывающему абоненту поднять трубку. Но, конечно, если вы 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-интерфейсах Какао. Когда вы видите методы класса, возвращающие новый объект, этот объект будет автоматически выпущен. Например, когда вы вызываете [NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]
, вы просите класс NSArray создать для вас массив. Если существует за пределами метода arrayWithObjects:
благодаря своему автоматически выпущенному статусу. Если вы этого не сделаете retain
, он будет выпущен в конце текущего цикла выполнения.
person
Simon Cave
schedule
29.03.2011