-1

すべて。私には方法があります:

-(void)connectToServer:(NSError**)error{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         //bla bla bla code;
         *error=[NSError bla bla bla];
    }
}

しかし、その後、エラー変数は変更されません。そのブロック変数はありません。__block変数としてマーク(NSError **)エラーのこのメソッドを変更するにはどうすればよいですか。__block varibaleがローカル変数にのみ使用される場合はどうなりますか?

ここで、__block属性を持つ組織のローカル変数の問題を解決します。

-(void)connectToServer:(NSError**)error{
    __block NSError *localError=*error;
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         //bla bla bla code;
         localError=[NSError bla bla bla];
    }
    *error=localError;
}

しかし、このソリューションは私のようではありません。なぜなら、__ block NSError * localError =*errorを再宣言する必要があるからです。

4

2 に答える 2

3

ブロック内から変更するには、ローカルスコープ変数errorは必要ありません。直接__block割り当てることはすでに行われています。*error = [NSError bla];

これerrorは、ローカル スコープのブロックによってキャプチャされるため機能します。変更することはできerrorませんが、一部が格納されているアドレスに逆参照することができ、これは実際にブロック内から変更できます。NSError *xx

NSError *xただし、参照されている変数errorが十分に永続的であることを完全に確認する必要があります。

于 2013-02-04T06:47:22.663 に答える
2

ム。

あなたがしていることはあまり意味がありません。そのconnectToServer:ブロックがerror変数を設定する前にメソッドが返される可能性が非常に高くなります。これは、呼び出し元が参照する有効なオブジェクトを持っていないことを意味します。

ブロックに別のメソッドを呼び出して、結果として生じるエラーを処理するか、ブロックを同期的に実行してconnectToServer:、ブロックが終了する前に返されないようにする必要があります。

また、2 番目のケースでは、Cocoa の規則に従ってエラー処理を行い、エラーが発生したことをメソッドの直接リターンによって示す必要があります。

これは次のいずれかに書き換える必要があります。

- (void)connectToServer
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //bla bla bla code including error generation
        dispatch_sync(/* Get appropriate queue; probably main */, ^{
            // Handle error somehow
        });
    });
}

または:

- (BOOL)connectToServer: (NSError **)e
{
    __block BOOL success = NO;
    // Note: dispatch_sync()
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //bla bla bla code;
        success = /* Get success value */;
        *e = /* Get error */;
    });
    return success;
}
于 2013-02-04T06:04:51.263 に答える