我可以返回已分配的对象并将其释放到函数外吗?

时间:2011-03-29 04:11:09

标签: iphone objective-c memory alloc

- (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方法中自动释放它?谢谢!

3 个答案:

答案 0 :(得分:6)

你所做的将会奏效。您可以选择任何范围内的retainrelease个对象,只要它们全部均匀(并且当任何其他对象不再需要该对象时,该对象将被释放)。

但你所做的并不是传统的。如果你想允许对象在方法的生命周期中存活(这样你可以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)

是的,你在那里所做的一切都会很好。