iPhone上的NSInvocationOperation内存问题

时间:2009-12-18 17:49:16

标签: iphone objective-c memory timer

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

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

-(void)methodCalledByTimer {

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

}

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

有谁可以解释我在这里做错了什么?我是否还必须做其他事情以确保NSInvocationOperation对象能够正确发布?

非常感谢您的帮助。

亲切的问候, 迈克尔。

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

我认为问题在于如何在不进行初始化的情况下进行分配。第一条有缺陷的线应该是:

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

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

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

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