- (NSString *)allocString{
NSString *str = [[NSString alloc] init];
return str;
}
- (void)viewDidLoad{
NSString *name = [self allocString];
[name release]; // Can I release an object here?
}
嗨,我刚刚用NSString写了一个简单的例子。在我的真实程序中,我使用了自定义的UIView类而不是NSString。
allocString创建一个NSString实例,其保留计数为1.如果没有自动释放,它只返回一个实例。
在viewDidLoad方法中,变量“name”只指向allocString方法返回的对象,因此实例的保留计数仍为1.
因此,[名称发布]会减少其保留计数。
这是对的吗?或者我必须在allocString方法中自动释放它?谢谢!
答案 0 :(得分:6)
你所做的将会奏效。您可以选择任何范围内的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
它,它将在当前运行循环结束时释放。
答案 1 :(得分:1)
如果你只是将“allocString”方法名称替换为“newString”,它可以正常工作。 目标C中有一个约定来处理这些方法。该惯例是方法名称应以“new *”开头,并且不会引发任何内存泄漏。
答案 2 :(得分:0)
是的,你在那里所做的一切都会很好。