0

メソッドから複数の値を返したいのですが、配列を使用することにしました。

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

4 に答える 4

1

いくつかのオプションがあります。

  1. 辞書を作成して返します。これには、配列上のアイテムの順序や数に依存しないという利点があります(NSArrayを返すよりも)。いくつかのアイテムを条件付きで返品できます。
  2. 返す必要のある情報を表す新しいクラスを実装します。クラスには必要なすべてのプロパティが含まれている必要があるため、インスタンスを作成し、プロパティを設定して返すことができます。
  3. 参照による返品:

    - (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.
    
于 2012-09-06T14:55:17.633 に答える
1

そのautoreleasepoolは不要です。runloopにはすでにautoreleaseプールがあり、戻り時に作成している配列はautoreleaseとしてタグ付けされているため、この配列は解放されます。

cから複数の値を返さないのと同じように、Objective-cメソッドから複数の値を返すことはありません。メソッドへの参照を渡してメソッド内に値を割り当てるか、返したいデータを含むコレクションオブジェクトを返すか、メソッドから返したい応答を含むカスタムクラスを作成できます。

于 2012-09-06T14:55:39.003 に答える
1

いいえ。明示的にリリースする必要がないように、正確な目的で自動リリースされます。ステートメントを自動解放プールでラップするreturn XYZ..と、解放されるか(割り当てが解除され、呼び出し元の関数への無効なポインターが返されるため、これは望ましくありません)、関数が返されるため、プールが発生することはなく、基本的にプール自体がリークすることになります。このようなものを追加しないか、呼び出し元関数で自動解放プールを使用します。

于 2012-09-06T14:56:11.247 に答える
1

ARCでコンパイルするときは、何もする必要はありません。ARCがこのメモリ管理を自動的に処理します。実際、ここでオブジェクトをautoreleaseブロックに入れるのは間違っています。これは、オブジェクトがメソッドの終わりを超えて存在し、呼び出し元に返される必要があるためです。

MRRでは、戻り値が自動リリースされたことを確認します。これがARCが行っていることです。

ただし、いずれかのスキームで配置される自動解放プールは、呼び出された関数の外部にある、より高いレベルにあります。

于 2012-09-06T15:01:27.853 に答える