0

NSURLConnectionを保持する「ServerDataLayer」という名前のクラスと、受信したHTTPデータを書き込むNSMutableDataがあります。接続が終了すると、呼び出し元が自分自身を参照として渡したデリゲートを起動するだけです。メソッドは次のようになります。

-(void) serverDataLayerResponse:(id)entity
{
    if ([entity isMemberOfClass:[LoginResponse class]])
    {
        LoginResponse *response = (LoginResponse*)entity;

        NSLog(@"Error Code: %d", response.errorCode);
        NSLog(@"Error Message: %@", response.errorMessage);
        NSLog(@"Registered: %c", response.registered);
        NSLog(@"AuthToken: %@", response.authToken);

        [AppData shared].authToken = response.authToken;

        ServerDataLayer *request = [[[ServerDataLayer alloc] initWithServer:_serverUrl delegate:self] autorelease];
        [request getPlayerDetails];
        //[_server getPlayerDetails];
    }
}

これが私の問題です...このデリゲートメソッドの進行中、内部の_receivedData変数と_connection変数が現在使用されています。同じServerDataLayerインスタンスを使用して、「[_ server getPlayerDetails]」から別のリクエストを実行したかったのですが、_connection変数と_receivedData変数が内部的に上書きされ、適切なタイミングで保持/解放するタイミングが混乱していました。

したがって、私の回避策は、サーバーと通信するたびにServerDataLayerをインスタンス化することでした。さて...上記の例では、「alloc」を使用してリクエストをインスタンス化し、この2番目のリクエストのスコープを失ったため、「autorelease」を設定しています。NSURLConnectionが内部でリクエストを実行している間、この2番目のリクエストはメモリに残りますか?

この種のプロセスのオブジェクト参照を管理する方法について、この時点で少し迷っています。どんな助けでもいただければ幸いです。

4

2 に答える 2

1

複数のServerDataLayerインスタンスを使用するだけです。

于 2012-10-04T23:50:10.677 に答える
1

NSURLConnectionデリゲートメソッドを介して使用される場合、は、実行ループへの入力としてそれ自体をアタッチします。ただし、デリゲートは保持されません。したがって、ServerDataLayer割り当てが解除されます(そして、うまくいけば、接続をキャンセルすることを忘れないでください)。潜在的な保持ループに適切に注意すれば、オブジェクトの関連付けを使用して、オブジェクトにURL接続と同じライフサイクルを与えることができます。

使用する場合sendAsynchronousRequest:...は、とにかく大丈夫でしょう。self完了ブロック内の参照またはインスタンス変数を想定すると、ブロックによって保持され、少なくともその期間は存続します。

もう保持/解放について混乱する必要はありません。ARCがオプションでない場合でも、関連するインスタンス変数をクラス拡張内の保持プロパティとして宣言し、self.property表記を使用して新しい値を設定できます。保持とリリースはあなたに代わって処理されます。

唯一の注意点は、インスタンス化されたクラスまたは破棄されたクラスのメソッドを呼び出すのは安全ではないというルールの特殊なケースとして、ドット表記を使用initdeallocてはならないということです。

于 2012-10-04T23:57:27.967 に答える