“readInBackgroundAndNotify”增加了接收者的保留计数

时间:2012-02-07 11:34:33

标签: iphone objective-c ios nsfilehandle

我正在使用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之前删除了观察者。在释放文件句柄对象之前还有什么我应该做的吗?

1 个答案:

答案 0 :(得分:1)

  

我注意到,readInBackgroundAndNotify正在增加retainCount   fileHandle by 1。

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

请注意retainCount没用;在这种情况下,它可能会增加5或42。这是无关紧要的。最重要的是,你要求它在后台做一些事情,直到达到“停止做背景”的状态,对象可能仍然存在。

  

因此,当我读完数据后,当我释放这个文件句柄时,   记忆未被释放。

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

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

相关问题