我想从方法中返回多个值,我决定使用数组来执行此操作
-(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]];
}
}
答案 0 :(得分:1)
您有几个选择。
返回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为你做的事情。
然而,它在任一方案中放入的自动释放池处于更高级别 - 在被调用函数之外。