与块和核心运动崩溃

时间:2010-11-12 15:35:25

标签: iphone cocoa-touch accelerometer release-management objective-c-blocks

我正在使用Core Motion的推送处理程序进行加速度计更新:

CMAccelerometerHandler accelerometerHandler = ^ (CMAccelerometerData *accelerometerData, NSError *error) {
    // handle update
};

[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]
                                    withHandler:[[accelerometerHandler copy] autorelease]];

此代码崩溃。如果我根本不复制块,我会在暂停/恢复时间歇性地崩溃。如果我删除autorelease它可以正常工作,但我认为这会产生泄漏。

我还尝试将块分配给ivar并在[motionManager stopAccelerometerUpdates]之后释放它。也崩溃了。

怎么来的?我一直以为我要平衡任何copy / retainrelease / autorelease

另请参阅:Copying blocks (ie: copying them to instance variables) in Objective-C

1 个答案:

答案 0 :(得分:1)

这里的问题是对块的所有权。当你认为块实际上只是对象时,它应该变得更加清晰。您需要将块复制到堆中,但是您需要将其视为您拥有所有权的所有其他对象。当取消分配在块上调用复制的对象时,您应该释放对块的所有权。