你所做的一切都会奏效。您可以从您选择的任何范围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];
}
这种行为在整个 Cocoa API 中都有使用。当您看到返回新对象的类方法时,该对象将被自动释放。例如,当您调用时,[NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]
您要求 NSArray 类为您创建一个数组。arrayWithObjects:
如果由于其自动释放状态而存在于方法之外。如果不这样做retain
,它将在当前运行循环结束时释放。