-2

从方法中返回 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)不值得(可忽略的)速度增益吗?

有没有更好的办法?

4

1 回答 1

1

这真的 - 真的取决于您的具体用例。您需要快速的方法吗?如果您不这样做,那么请继续使用 an NSArray,尽管我建议您使用更简洁的现代语法,因此更易于阅读:

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

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

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

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

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

于 2015-06-02T11:28:40.203 回答