1

NSFileHandle用来从套接字读取数据。这就是我创建的方式filehandle

文件句柄 = [[NSFileHandle alloc] initWithFileDescriptor:sock closeOnDealloc:YES];

我正在这样做:

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

我注意到,readInBackgroundAndNotify正在增加retainCount1。fileHandle因此,当filehandle我在完成读取数据后释放它时,内存不会被释放。因此它试图读取一些无效数据并且应用程序崩溃了。请注意,这个问题在 ios 4.3 中发生,但在 ios 5 中没有。我在发布filehandle. 在释放文件句柄对象之前我还应该做些什么吗?

4

1 回答 1

1

我注意到,readInBackgroundAndNotify 将 fileHandle 的 retainCount 增加了 1。

因为它可能应该作为实现细节的一部分......您要求filehandle在后台有效地安排,以便如果数据到达,它将通知。

注意retainCount是没用的;在这种情况下,它可能增加了 5 或 42。这是无关紧要的。底线是您要求它在后台执行某些操作,并且在达到“停止在后台执行操作”状态之前,该对象可能仍然处于活动状态。

因此,当我完成读取数据后释放此文件句柄时,不会释放内存。

您是否告诉文件句柄停止在后台读取?也许通过closeing 它?如果没有,它可能会继续。

iOS 4 和 5 之间的区别在于,可能存在文件句柄指出没有更多观察者的逻辑,因此会自动停止读取。同样,您不应该指望一个实现细节。

于 2012-02-08T00:00:22.053 回答