2012-09-06 92 views
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]]; 
    } 
} 
+2

你可以写成'@ [node,@(i),@(flag)]' – hypercrypt

+0

我已经编辑了你的问题,专注于内存管理方面。关于如何返回多个值的问题已经在SO上至少提出了两次。这有答案:[从方法返回多个值](http://stackoverflow.com/questions/1692005/returning-multiple-values-from-a-method-in-objective-c?rq=1) –

回答

1

这autoreleasepool是不必要的。 runloop已经有一个autorelease池,并且你在返回时创建的数组被标记为autorelease,所以这个数组将被释放。

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

+0

aha ,它需要返回的数据非常奇特,创建一个只包含这个数据集合的类似乎很奇怪 –

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

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

+0

你可以泄漏池本身,你确定吗? –

+0

@JeremyL仅当它作为反向悬挂指针安全特性内置到编译器中时才有效。 – 2012-09-17 18:29:16

1

使用ARC进行编译时不需要执行任何操作 - 它会为您处理此内存管理。实际上,将对象放入autorelease块中的方法是错误,因为您需要该对象超过方法的末尾并返回给调用方。

根据MRR,你确保返回值是autoreleased,这就是ARC为你做的。

但是,在任何方案下放置的自动释放池都处于较高级别 - 在被调用的函数之外。