使用accelerometerData时内存泄漏

时间:2013-07-02 04:04:24

标签: memory-leaks

@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中运行应用程序时 - >乐器,我发现生活记忆不断增加, 直到应用程序收到内存变暖并被系统杀死。     我尝试在while块中重新加载accelerometerData。但没有效果。 motionManager.accelerometerData release];

我不想使用startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue]                                         withHandler:^(CMAccelerometerData * accelerometerData,NSError * error),因为我想在后台运行它,这个块在应用程序暂停时不起作用。

Can anyone help me?  

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

1 个答案:

答案 0 :(得分:0)

你在使用ARC吗?你应该使用它。

您还必须确保您的bakground线程具有自动释放池。创建启用ARC的自动释放池的语法是@autorelease { ... },没有ARC的语法是NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; ... [pool release];

Apple提供了有关自动释放池如何工作的出色文档。一个是为主线程自动创建的,但您必须手动为后台线程创建它。你需要花几个小时来学习它是如何工作的,它是任何obj-c程序员必须学习的。

没有看到你的所有代码,我无法告诉你它是如何工作的......但很可能你创建线程的块或方法需要它包含在自动释放池中的内容以及你的{的内容{1}}循环需要第二个自动释放池。


编辑:既然我已经看过你的代码了,你这里是一个如何使用@autoreleasepool来避免内存泄漏的例子。我在此代码中添加了第6行和第23行:https://gist.github.com/abhibeckert/5907754

我没有测试过,但这应该可以解决您的问题。如果没有那些自动释放池,它肯定会泄漏内存。

基本上,如果你有一个后台线程或长时间循环,每个都需要拥有自己的自动释放池。我建议您阅读:http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html