【问题标题】:Releasing object being returned the right way?释放对象以正确的方式返回?
【发布时间】:2011-05-02 09:48:44
【问题描述】:

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

- (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?如果没有内存泄漏,这段代码会是什么样子?

【问题讨论】:

    标签: objective-c ios memory-management


    【解决方案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;
    }
    

    正如我所提到的,您还可以将autoreleasealloc/init 一起使用:

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

    同样,我在上面链接到的 Apple 文档是寻找内存管理问题答案的最佳地方。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-08
      • 2015-09-01
      • 2010-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多