0

我想从一个方法返回多个值,我决定使用一个数组来这样做

-(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

4 回答 4

1

使用 ARC 进行编译时,您不需要做任何事情——它会为您处理这种内存管理。实际上,在这里将对象放入自动释放块中是错误的,因为您需要对象在方法结束后存活并返回给调用者。

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

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

于 2012-09-06T15:01:27.853 回答
1

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

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

于 2012-09-06T14:55:39.003 回答
1

没有。它是自动释放的,目的是为了不必明确地释放它。如果您将return XYZ..语句包装在自动释放池中,它将被释放(这不是您想要的,因为它随后被释放并且您返回一个无效的指向调用函数的指针),或者由于函数返回,耗尽pool 永远不会发生,并且您基本上最终会泄漏池本身。你要么不添加这样的东西,要么在调用者函数中使用自动释放池。

于 2012-09-06T14:56:11.247 回答
1

你有几个选择。

  1. 创建并返回字典。这有一个优点(相对于返回 NSArray),您不依赖于数组上的项目的顺序或数量。您可以有条件地退回一些物品。
  2. 实现一个表示您需要返回的信息的新类。该类应该具有所有必需的属性,因此您可以创建一个实例,设置属性并返回它。
  3. 通过引用返回:

    - (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.
    
于 2012-09-06T14:55:17.633 回答