释放返回的对象的正确方式?

3
如果我在函数内创建一个对象并返回它,那么应该在什么时候/何处释放此对象?以下是一个创建对象的示例。
- (NSDictionary*) sampleFunction
{
    NSMutableDictionary* state = [[NSMutableDictionary alloc] initWithCapacity:5];

    [state setObject:[[NSNumber alloc] initWithInt:self.a]  forKey:@"a"];
    [state setObject:[[NSNumber alloc] initWithInt:self.b] forKey:@"b"];
    [state setObject:[[NSNumber alloc] initWithInt:self.c] forKey:@"c"];

    return state;
}

附加问题:为了避免内存泄漏,我还需要释放在这里分配的NSNumbers吗?如果没有内存泄漏,这段代码会是什么样子?

1个回答

1

首先,您应该查看此指南以了解所有规则:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

...不要把人们在这里说的话当成真理。有一些例外和奇怪的规则,上面链接的指南会澄清。

现在,关于你的例子:广义而言,每次你alloc东西时都必须释放它。当你从一个方法返回一个值时,它应该是自动释放的(99%的时间。有几个例外情况:看,没有什么能够轻松解决问题!)。苹果提供了一些方便的自动释放方法-NSNumber就有其中之一。

我将展示您上面的代码,但重写为使用那些自动释放的方法:

- (NSDictionary*) sampleFunction
{
    NSMutableDictionary* state = [NSMutableDictionary dictionaryWithCapacity:5];

    [state setObject:[NSNumber numberWithInt:self.a]  forKey:@"a"];
    [state setObject:[NSNumber numberWithInt:self.b] forKey:@"b"];
    [state setObject:[NSNumber numberWithInt:self.c] forKey:@"c"];

    return state;
}

正如我所提到的,您也可以在alloc/init中使用 autorelease
NSMutableDictionary* state = [[[NSMutableDictionary alloc] initWithCapacity:5]autorelease];

再次强调,我上面提供的苹果文档是回答内存管理问题的最佳去处。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接