使用方法调用进行内存管理

时间:2012-10-03 08:06:54

标签: objective-c ios memory-management memory-leaks

我有一个关于Objective-c中的内存管理和调用方法的非常简单的问题。

想象一下我有:

- (void)someFunction
{
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"Value 1", nil];
    [self someOtherFunction:array];
}

- (void)someOtherFunction:(NSMutableArray *)array
{
    // Should I retain array here?
    [array addObject:@"Value 2"];
    // And then release ?
}

这是一个简单的例子,但想象我们有10个方法调用具有相同的对象参数。 什么是最好的解决方案?

2 个答案:

答案 0 :(得分:1)

如果你是所有的腰带和大括号,那么你应该在每个方法调用中保留/释放。事实上,这正是ARC在幕后为您所做的事情。 (据我所知,它没有记录,可能会因版本而异。)

当然,如你所说,保留/释放不会造成任何伤害。在实践中,它不太可能增加很多开销。

说了这么多:大多数人添加保留/释放。如果您的代码全部在主线程上运行,那么在您执行方法时,您的对象不太可能被释放。

答案 1 :(得分:0)

(这解释了ARC被禁用时的参考计数)

使用便捷构造函数时,返回的对象将作为自动释放的对象返回。

Autorelease意味着在当前runloop的末尾,对象的引用计数将减少1.如果对象未从创建中保留到此点,则意味着它将被释放。

这意味着在您的代码中,您不需要添加任何保留/释放调用,因为对象将一直存在,直到someFunction方法结束。

如果在someFunction方法结束时需要保持数组生存,例如在实例变量中,您可以使用以下方法保留数组:

_myInstanceVar = [array retain]; // don't forget to release it in dealloc method