1

NSFileHandleソケットからデータを読み取るために使用しています。これが私が作成している方法ですfilehandle

filehandle = [[NSFileHandle alloc] initWithFileDescriptor:sock closeOnDealloc:YES];

私はこれをやっています:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readData:)    name:nil object:filehandle];
[filehandle readInBackgroundAndNotify];

readInBackgroundAndNotifyが1ずつ増加していることに気付きretainCountましfileHandleた。したがって、filehandleデータの読み取りが完了したらこれを解放しても、メモリは解放されません。そのため、無効なデータを読み取ろうとしてアプリがクラッシュします。この問題はiOS4.3で発生していますが、iOS5では発生していないことに注意してください。をリリースする前にオブザーバーを削除していfilehandleます。ファイルハンドルオブジェクトを解放する前に他にすべきことはありますか?

4

1 に答える 1

1

readInBackgroundAndNotifyがfileHandleのretainCountを1増やしていることに気付きました。

実装の詳細の一部として必要になる可能性が高いので...filehandleデータが到着した場合に通知されるように、バックグラウンドで効果的にスケジュールするように求めています。

retainCountそれは役に立たないことに注意してください。この状況では、5または42増加した可能性があります。関係ありません。肝心なのは、バックグラウンドで何かをするように要求していて、「バックグラウンドで何かをするのをやめる」状態に達するまで、オブジェクトはまだ生きている可能性が高いということです。

したがって、データの読み取りが完了した後でこのファイルハンドルを解放しても、メモリは解放されません。

バックグラウンドでの読み取りを停止するようにファイルハンドルに指示しましたか?おそらくそれをcloseすることによって?そうでない場合は、継続する可能性があります。

iOS 4と5の違いは、ファイルハンドルがオブザーバーがなくなったことを通知し、自動的に読み取りを停止するロジックが存在する可能性があることです。繰り返しますが、信頼してはいけない実装の詳細。

于 2012-02-08T00:00:22.053 に答える