2009-12-18 62 views
0

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

的方法将被称为第二的每1/4,我已经问题的源缩小到下面的测试线:

-(void)methodCalledByTimer { 

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

} 

在取消这两条线(以产生一个空的方法)将防止内存问题出现。一旦他们进入,内存使用量将增加得相当快,最终该应用程序将被终止。

任何人都可以解释我在做什么错吗?我需要做其他事情来确保NSInvocationOperation对象将被正确释放吗?

非常感谢您的帮助。

亲切的问候, 迈克尔。

回答

0

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

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

+0

你知道我是否真的可以重用NSInvocationOperation对象吗?我将该对象添加到NSOperationQueue,并在队列完成后让队列处理该操作。因此,为了保持操作并重用它,我会将它保留在某处并使用initWithTarget:selector:object重新启动它,以便第二次运行?不知道,如果那真的能起作用,但我可以试一试,让它知道它是否有效。感谢您的快速反馈! – 2009-12-20 12:37:09

0

我相信问题在于你如何分配而不需要初始化。第一个马车行应改为:

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

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

“操作对象是一次性对象 - 即它执行一次任务,不能再次执行它。”

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