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


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


我正在这样做:

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


我注意到,readInBackgroundAndNotifyretainCountfileHandle增加1。因此,一旦我完成数据读取后就释放了此filehandle,则不会释放内存。因此,它试图读取一些无效数据,导致应用崩溃。请注意,此问题发生在ios 4.3中,而不是在ios 5中。
我要在发布filehandle之前删除观察者。在释放文件句柄对象之前,我还有什么要做的事情?

最佳答案

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


可能作为实现细节的一部分……您正在要求filehandle在后台进行有效调度,以便在数据到达时通知。

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


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


您是否已告知文件句柄停止在后台读取?也许通过close进行处理?如果没有,它可能会继续。

iOS 4和5之间的区别在于,文件句柄可能会注意到不再有观察者,因此逻辑会自动停止读取。同样,您不应该依靠实现细节。

关于iphone - “readInBackgroundAndNotify”增加了接收者的保留数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9175520/

10-11 03:27