1

私は使用する機能を持っていますdispatch_async

- (void)_handleMessage:(id)message{
    dispatch_async(_callbackQueue, ^{
        [self.delegate webSocket:self didReceiveMessage:message];
    });
}

この関数をこのように呼び出しています

NSString *str = [[NSString alloc] initWithData:frameData encoding:NSUTF8StringEncoding];
[self _handleMessage:str]
//[str release];  <== Can I release str here???

私の質問は

  • variable はどこで解放できますstrか?

通常は call の直後に解放できます[self _handleMessage:str]が、dispatch_async はステートメントを実行するため、

[self.delegate webSocket:self didReceiveMessage:message];

非同期に (おそらくしばらくしてから)、不正なアクセス エラーを考えています。この場合、メモリを管理する最良の方法は何ですか?

まだ疑問がある場合は、私は古い学校の男で、ARC を使用していません。

4

1 に答える 1

7
    //[str release];  <== Can I release str here???

私が理解している限り、そこで変数を解放できます。確かに

手動で参照カウントされる環境では、ブロック内で使用されるローカル変数は、ブロックがコピーされるときに保持されます。ブロック内でインスタンス変数を使用すると、オブジェクト自体が保持されます。特定のオブジェクト変数に対してこの動作をオーバーライドする場合は、__block ストレージ タイプ修飾子でマークできます。

これは、ブロックがmessage内部で使用するオブジェクトを保持し、完了すると解放することを意味します。したがって、 を呼び出した後に自由に解放できます_handleMessage

于 2012-06-20T10:30:56.387 に答える