【问题标题】:"readInBackgroundAndNotify" increases retain count of receiver“readInBackgroundAndNotify”增加接收者的保留计数
【发布时间】:2012-02-07 11:34:32
【问题描述】:

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

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

我正在这样做:

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

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

【问题讨论】:

    标签: iphone objective-c ios nsfilehandle


    【解决方案1】:

    我注意到,readInBackgroundAndNotify 正在增加 retainCount 文件句柄的 1。

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

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

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

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

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

    【讨论】:

    • 我不确定如何让文件句柄停止在后台读取。我尝试在释放文件句柄之前关闭它。不过没用。
    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 2011-05-09
    相关资源
    最近更新 更多