2009-12-18 30 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對象兩次。