我正在使用NSFileHandle
从套接字读取数据。
这就是我创建filehandle
的方式:
filehandle = [[NSFileHandle alloc] initWithFileDescriptor:sock
closeOnDealloc:YES];
我正在这样做:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readData:) name:nil object:filehandle];
[filehandle readInBackgroundAndNotify];
我注意到,
readInBackgroundAndNotify
将retainCount
的fileHandle
增加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/