2011-05-02 47 views
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

首先,你应该去这个指南的所有规则:

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

...不要把人放在这里作为福音说什么。我上面链接的指南中会列出一些例外情况和奇怪的规则。

现在,与你的例子有关:广泛地说来说,每次你都必须发布它alloc。当你从一个方法返回一个值时,它应该是autoreleased(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; 
} 

正如我提到的,你也可以使用autoreleasealloc/init

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

再次,我上面链接的Apple文档是要回答内存管理问题的地方。

+0

这非常有帮助,谢谢。 – Mark 2011-05-02 10:05:15

相关问题