【问题标题】:Memory management of return value返回值的内存管理
【发布时间】:2012-09-06 14:48:50
【问题描述】:

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

-(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]];
    }
}

【问题讨论】:

  • 你可以写成@[node, @(i), @(flag)]
  • 我对您的问题进行了一些编辑,以专注于内存管理方面。关于如何返回多个值的问题已经在 SO 上至少被问过两次。这有答案:Returning multiple values from a method

标签: objective-c memory-management


【解决方案1】:

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

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

【讨论】:

  • 啊哈,它需要返回的数据非常稀有,创建一个类来包含这个数据集合可能看起来很奇怪
【解决方案2】:

你有几个选择。

  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.
    

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 你可以泄漏池本身,你确定吗?
    • @JeremyL 仅当它作为反悬空指针安全功能内置到编译器中时。
    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-28
      • 1970-01-01
      • 2012-06-15
      • 2011-05-30
      • 2011-07-20
      • 2020-09-21
      相关资源
      最近更新 更多