-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

それは本当にあなたの特定のユースケースに依存します。メソッドを高速にする必要がありますか?そうでない場合は、先に進んで を使​​用してNSArrayください。ただし、より簡潔で読みやすい最新の構文を使用することをお勧めします。

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

2 つ (または少数の固定数) の整数のみを返す必要があることが確実な場合は、構造体も返すことができます。

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

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

ところで、上記の「古典的な」アプローチは… 危険で醜いです。static変数は関数呼び出し間で共有されます (異なるオブジェクトのメソッド呼び出し間でも)。これは、通常、オブジェクトに関連する何かを返すメソッドの予想されるセマンティクスとは完全に異なるため、コードを使用しようとするプログラマーを混乱させます。そうしないでください。

于 2015-06-02T11:28:40.203 に答える