【问题标题】:NSInvocationOperation Memory Problems on iPhoneiPhone上的NSInvocationOperation内存问题
【发布时间】:2009-12-18 17:49:15
【问题描述】:

在 NSTimer 反复调用的方法中使用 NSInvocationOperation 时,我遇到了内存问题(应用程序将运行几次迭代,然后收到内存不足警告并最终被终止)。

该方法将每 1/4 秒调用一次,我已将问题的根源缩小到以下测试行:

-(void)methodCalledByTimer {

        NSInvocationOperation *o = [NSInvocationOperation alloc];
        [o release];

}

取消注释这两行(生成一个空方法)将防止出现内存问题。一旦它们进入,内存使用量会迅速增加,最终应用程序将被终止。

谁能解释我在这里做错了什么?我是否必须做任何其他事情来确保 NSInvocationOperation 对象将被正确释放?

非常感谢您的帮助。

亲切的问候, 迈克尔。

【问题讨论】:

    标签: iphone objective-c memory timer


    【解决方案1】:

    一种可能的解决方案可能是将您的 NSInvocationOperation 存储在其他地方,而不是在每次调用 methodCalledByTimer 时创建和释放一个。

    我在使用 NSCalendar 时遇到问题,我会创建和发布一千次以用于某些日期工作,但随后我只创建了一个附加到 appDelegate 的日历并每次都访问它。修复了大量内存泄漏,这可能比每次都创建一个新对象要好。

    【讨论】:

    • 你知道我是否真的可以重用 NSInvocationOperation 对象吗?我将对象添加到 NSOperationQueue 并让队列在完成后处理操作。因此,为了保持操作并重用它,我会将它保留在某个地方并使用 initWithTarget:selector:object “重新初始化”它以进行第二次运行?不确定,如果这真的有效,但我可能会试一试,让你知道它是否有效。感谢您的快速反馈!
    【解决方案2】:

    我认为问题在于您如何在不初始化的情况下进行分配。错误的第一行应该是:

    NSInvocationOperation *o = [[NSInvocationOperation alloc] initWithTarget:yourTarget selector:@selector(yourSelector) object:yourObjectOrNil];
    

    关于 mjdth 的回答,我相信您不应该尝试重用调用操作。来自 NSOperation(NSInvoationOperation 的超类)的文档:

    “一个操作对象是一个单次的对象——也就是说,它只执行一次它的任务,不能再用它来执行它。”

    此外,任何 Objective-C 对象都不应该被初始化两次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多