如果我在函数内部创建一个对象并返回它,那么何时/何地应该释放这个对象?这是我创建对象的示例。
- (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吗?没有内存泄漏,这段代码会是什么样子?
答案 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文档是解决内存管理问题的最佳位置。