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 -> Instruments 中运行应用程序时,我发现 Living Memory 不断增加,直到应用程序收到内存变暖并被系统杀死。我尝试在 while 块中释放 accelerometerData。但没有效果。motionManager.accelerometer数据发布];

我不想将 startAccelerometerUpdatesToQueue:[NSOperationQueue currentQueue] 与Handler:^(CMAccelerometerData *accelerometerData,NSError *error) 一起使用,因为我想在后台运行它,而当应用程序暂停时,此块不起作用。

Can anyone help me?  

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

1 回答 1

0

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

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

Apple 有关于自动释放池如何工作的优秀文档。一个是为主线程自动创建的,但您必须为后台线程手动创建它。你需要花几个小时来学习它是如何工作的,这是任何 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

于 2013-07-02T04:08:14.723 回答