Objective c 返回值的内存管理

Objective c 返回值的内存管理,objective-c,memory-management,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

我想从一个方法返回多个值,我决定使用一个数组来实现

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

你有几个选择

  • 创建并返回字典。这有一个优点(与返回NSArray相比),即不依赖于数组中项目的顺序或数量。您可以有条件地返回一些项目
  • 实现一个表示需要返回的信息的新类。该类应该具有所有必需的属性,因此您可以创建一个实例,设置属性并返回它
  • 通过以下方式返回:

    你可以这样称呼它:

    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.
    

  • 你有几个选择

  • 创建并返回字典。这有一个优点(与返回NSArray相比),即不依赖于数组中项目的顺序或数量。您可以有条件地返回一些项目
  • 实现一个表示需要返回的信息的新类。该类应该具有所有必需的属性,因此您可以创建一个实例,设置属性并返回它
  • 通过以下方式返回:

    你可以这样称呼它:

    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.
    

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


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

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


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

    没有。它的自动释放是为了达到确切的目的,而不必显式地释放它。如果将
    return XYZ..
    语句包装在自动释放池中,它将被释放(这不是您想要的,因为它随后被释放,并且您将返回一个指向调用方函数的无效指针),或者由于函数返回,池的排空将永远不会发生,并且基本上会导致池本身泄漏。您要么不添加类似的内容,要么在调用方函数中使用自动释放池。

    否。它的自动释放是为了达到确切的目的,而不必显式地释放它。如果将
    return XYZ..
    语句包装在自动释放池中,它将被释放(这不是您想要的,因为它随后被释放,并且您将返回一个指向调用方函数的无效指针),或者由于函数返回,池的排空将永远不会发生,并且基本上会导致池本身泄漏。您或者不添加任何类似的内容,或者使用调用方函数中的自动释放池。

    使用ARC编译时,您无需执行任何操作,它会为您管理内存。事实上,在这里将对象放入autorelease块是错误的,因为您需要对象超过方法的结尾并返回给调用方

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


    然而,在这两种方案下放入的自动释放池都处于更高的级别—在被调用函数之外。

    使用ARC编译时,您不需要做任何事情—它为您管理内存。事实上,在这里将对象放入autorelease块是错误的,因为您需要对象超过方法的结尾并返回给调用方

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


    然而,在这两种方案下放入的自动释放池都处于更高的级别——在被调用函数之外。

    您可以将其写成
    @[node,@(i),@(flag)]
    我对您的问题进行了一些编辑,以将重点放在内存管理方面。关于如何返回多个值的问题已经被问过至少两次了。这就是答案:你可以把它写成
    @[node,@(i),@(flag)]
    我已经对你的问题进行了一些编辑,把重点放在内存管理方面。关于如何返回多个值的问题已经被问过至少两次了。这就有了答案:啊哈,它需要返回的数据非常零散,而创建一个只包含此数据集合的类可能看起来很奇怪啊哈,它需要返回的数据非常零散,创建一个只包含此数据集合的类可能看起来很奇怪你可能会泄漏池本身,你确定吗?@JeremyL仅当它作为反悬挂指针安全功能内置到编译器中时。你可以泄漏池本身,确定吗?@JeremyL仅当它作为反悬挂指针安全功能内置到编译器中时。