2013-07-02 28 views
1
@property (nonomic,retain) CMMotionManager *motionManager; //delcare as a property. 

motionManager = [[CMMotionManager alloc] init]; //init it. 

motionManager.accelerometerUpdateInterval = 0.2f; 

以下全部在線程(而不是主線程)中執行。使用加速計時存儲器泄漏數據

-(void)handle{ 

    [motionManager startAccelerometerUpdates]; 
    while (1) { 
     CMAcceleration acceleration = motionManager.accelerometerData.acceleration; 
     NSLog(@"%f %f %f",acceleration.x,acceleration.y,acceleration.z); 
     sleep(0.5); 
    } 
} 

當我運行在Xcode應用程序 - >儀器,我發現人們記憶uninterruptly增加, 直到應用收到內存變暖和系統殺死。 我嘗試在while塊中放置accelerometerData。但不起作用。 motionManager.accelerometerData release];

我不希望使用startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] withHandler:^(CMAccelerometerData * accelerometerData,NSError *錯誤),監守我想在後臺運行,而該塊不作任何功能時,應用程序是暫停。

Can anyone help me? 

screenshot image:http://img.blog.csdn.net/20130702120140593 

回答

0

您是否在使用ARC?你應該使用它。

你還必須確保你的bakground線程有一個autorelease池。使用ARC創建自動釋放池的語法是@autorelease { ... },沒有ARC的語法是NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; ... [pool release];

蘋果有關於autorelease池如何工作的優秀文檔。一個是爲主線程自動創建的,但您必須手動爲後臺線程創建它。你需要花費幾個小時來學習它是如何工作的,它是任何obj-c程序員必須學習的。

沒有看到你所有的代碼,我不能告訴你它是如何工作的......但最有可能你創建線程的塊或方法需要它的內容包裝在自動釋放池中,還有你的內容while循環需要第二個自動釋放池。


編輯:現在我已經看到你的代碼,你在這裏是一個如何使用@autoreleasepool來避免內存泄漏的例子。我在此代碼中添加了第6行和第23行:https://gist.github.com/abhibeckert/5907754

我還沒有測試過,但那應該可以解決您的問題。如果沒有這些自動釋放池,它肯定會泄漏內存。

基本上,如果你有一個後臺線程或長時間循環,每個需要有它自己的自動釋放池。我推薦閱讀:http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

+0

我嘗試使用@autorelease {...}或NSAutoreleasePool,但問題總是存在。我的項目網址:http://qq644531343.opendrive.com/files/Ml8yMjE0NjY3MV9kY2NUQl9mYWQ3/Testautoreleasepool.zip –

+0

@LiuLiBo看到我編輯的答案。 :-) –

+1

非常感謝。你的方式解決了這個問題。 –