从Obj-C中的方法返回2个(或更多)变量的最佳方法是什么?

时间:2015-06-02 11:22:54

标签: objective-c multiple-return-values

从方法中返回2个(或更多)变量的最佳方法是什么?

假设我想将2个整数值(例如a = 10& b = 20)返回到(父)方法,并将它们加载到变量myFirst和mySecond。

两种方式都有效,但哪种方式更好?

1)"古典"方式:

-(int *)returnMyValues1
{
    int a = 10, b = 20;
    static int myResult[2];

    myResult[0] = a;
    myResult[1] = b;

    return myResult;
}

...

int *result;
result = [viewSeatsAndMore returnMyValues];
myFirst = *result;
mySecond = *(result+1);

2)"目标"方式:

-(NSArray *)returnMyValues2
{
    int a = 10, b = 20;
    return [NSArray arrayWithObjects:[NSNumber numberWithInt:a], [NSNumber numberWithInt:b], nil];
}

...

NSArray *result = [self returnMyValues2];
myFirst = [[result objectAtIndex:0] intValue];
mySecond = [[result objectAtIndex:1] intValue];

关于速度,用100万次迭代测试它们,第一种方式快6秒。

但记忆呢?是"静态int"比NSArray好吗?

内存的保留(由于静态int)不值得(可忽略的)速度增益吗?

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

这实际上取决于您的具体用例。你需要快速的方法吗?如果你不这样做,那就继续使用NSArray,虽然我建议你使用更简洁的现代语法,因此更容易阅读:

- (NSArray *)returnAnArray {
    return @[ @42, @1337 ];
}

如果你确定你只需要返回两个(或一个小的,固定数量的)整数,你也可以返回一个结构:

typedef struct {
    int first;
    int second;
} TwoInts;

- (TwoInts)returnTwoInts {
    return (TwoInts){ 13, 37 };
}

顺便说一下,你上面的“经典”方法是......危险而丑陋。 static变量在函数调用之间共享(甚至跨不同对象的方法调用)。通常,这与返回与对象相关的内容的方法的预期语义完全不同,因此它会使尝试使用代码的程序员感到困惑。不要那样做。