内存管理的返回值

时间:2012-09-06 14:48:50

标签: objective-c memory-management

我想从方法中返回多个值,我决定使用数组来执行此操作

-(NSArray *) foo {
    // some operations here
    return @[node, [NSNumber numberWithInt:i], [NSNumber numberWithBool:flag]];
}

一个例子是

-(NSArray *) foo {
    return @[@"hi", [NSNumber numberWithInt:3], [NSNumber numberWithBool:YES]];
}

这是一种首选方式,并且因为有一个NSArray对象被创建,需要保留,但可以在以后没有新所有者时发布,这是否真的需要在自动释放池?

-(NSArray *) foo {
    @autorelease {
        // some operations here
        return @[node, [NSNumber numberWithInt:i], [NSNumber numberWithBool:flag]];
    }
}

4 个答案:

答案 0 :(得分:1)

您有几个选择。

  1. 创建并返回字典。这具有优势(超过返回NSArray),您不依赖于阵列上的项目的顺序或数量。你可以有条件地退回一些物品。
  2. 实现一个新类,表示您需要返回的信息。该类应具有所有必需的属性,因此您只需创建一个实例,设置属性并将其返回。
  3. 返回reference

    - (void)someMethod:(int)argument returnValue1:(int *)ret1 returnValue2:(int *)ret2;
    

    然后您可以这样称呼它:

    int r1;
    int r2;
    [object someMethod:arg returnValue1:&r1 returnValue2:&r2];
    // r1 and r2 now contain the values that were set in the method implementation.
    

答案 1 :(得分:1)

自动释放池是不必要的。 runloop已经有一个自动释放池,你在返回时创建的数组被标记为autorelease,因此,这个数组将被释放。

您不会从objective-c方法返回多个值,就像您不从c返回多个值一样。您可以传递对方法的引用并在方法中分配值,或者返回包含要返回的数据的集合对象,或者创建包含您希望从方法返回的响应的自定义类。

答案 2 :(得分:1)

不。它的自动释放用于确切目的,以便不必明确释放它。如果将return XYZ..语句包装在自动释放池中,它将被释放(这不是你想要的,因为它会被解除分配并返回一个指向调用函数的无效指针),或者由于函数返回,池的排空永远不会发生,并且您最终会泄漏池本身。你要么不添加这样的东西,要么在来电功能中使用自动释放池。

答案 3 :(得分:1)

使用ARC进行编译时无需执行任何操作 - 它会为您完成此内存管理。实际上,将对象置于自动释放块中是错误的,因为您需要将对象放在方法的末尾并返回给调用者。

在MRR下,你确保返回值是自动释放的,这就是ARC为你做的事情。

然而,它在任一方案中放入的自动释放池处于更高级别 - 在被调用函数之外。