我正在使用NSFileHandle
从套接字读取数据。
这就是我创建filehandle
:
filehandle = [[NSFileHandle alloc] initWithFileDescriptor:sock closeOnDealloc:YES];
我这样做:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(readData:) name:nil object:filehandle];
[filehandle readInBackgroundAndNotify];
我注意到,readInBackgroundAndNotify
正在将retainCount
的{{1}}增加1.因此,当我读完数据后释放此fileHandle
时,内存为没有发布。因此它试图读取一些无效数据,应用程序崩溃。请注意,此问题发生在ios 4.3中,但不发生在ios 5中。
我在发布filehandle
之前删除了观察者。在释放文件句柄对象之前还有什么我应该做的吗?
答案 0 :(得分:1)
我注意到,readInBackgroundAndNotify正在增加retainCount fileHandle by 1。
因为它可能应该作为实施细节的一部分......您要求filehandle
在后台有效安排,以便如果数据到达,它将通知。
请注意retainCount
没用;在这种情况下,它可能会增加5或42。这是无关紧要的。最重要的是,你要求它在后台做一些事情,直到达到“停止做背景”的状态,对象可能仍然存在。
因此,当我读完数据后,当我释放这个文件句柄时, 记忆未被释放。
您是否告诉文件句柄停止在后台阅读?也许是close
它?如果没有,它可能会继续。
iOS 4和5之间的区别在于可能存在逻辑,其中文件句柄指出不再有观察者,因此停止自动读取。同样,您不应该依赖的实现细节。