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

时间:2011-05-02 09:48:45

标签: objective-c ios memory-management

如果我在函数内部创建一个对象并返回它,那么何时/何地应该释放这个对象?这是我创建对象的示例。

- (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 个答案:

答案 0 :(得分:1)

首先,您应该阅读本指南中的所有规则:

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

......不要把人们在这里所说的视为福音。我上面链接的指南有一些例外和奇怪的规则将澄清。

现在,与您的示例相关:广泛发言,每当您alloc某事必须释放它时。当你从一个方法返回一个值时,它应该是autoreleased(99%的时间。有几个例外:看,没有什么是容易的!)。为方便起见,Apple提供了一些自动发布的方法 - 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;
}

正如我所提到的,您也可以autorelease使用alloc/init

NSMutableDictionary* state = [[[NSMutableDictionary alloc] initWithCapacity:5]autorelease];

同样,我上面链接的Apple文档是解决内存管理问题的最佳位置。