我遇到了内存问题(应用程序将运行几次迭代,然后接收低内存警告并最终被终止),同时在NSTimer重复调用的方法中使用NSInvocationOperation。
该方法将每1/4秒调用一次,我将问题的根源缩小到以下测试线:
-(void)methodCalledByTimer {
NSInvocationOperation *o = [NSInvocationOperation alloc];
[o release];
}
取消注释这两行(以产生空方法)将防止出现内存问题。一旦它们进入,内存使用量将迅速增加,最终应用程序将被终止。
有谁可以解释我在这里做错了什么?我是否还必须做其他事情以确保NSInvocationOperation对象能够正确发布?
非常感谢您的帮助。
亲切的问候, 迈克尔。
答案 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对象都不应该初始化两次。