我正在使用Core Motion的推送处理程序进行加速度计更新:
CMAccelerometerHandler accelerometerHandler = ^ (CMAccelerometerData *accelerometerData, NSError *error) {
// handle update
};
[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:[[accelerometerHandler copy] autorelease]];
此代码崩溃。如果我根本不复制块,我会在暂停/恢复时间歇性地崩溃。如果我删除autorelease
它可以正常工作,但我认为这会产生泄漏。
我还尝试将块分配给ivar并在[motionManager stopAccelerometerUpdates]
之后释放它。也崩溃了。
怎么来的?我一直以为我要平衡任何copy
/ retain
和release
/ autorelease
?
另请参阅:Copying blocks (ie: copying them to instance variables) in Objective-C
答案 0 :(得分:1)
这里的问题是对块的所有权。当你认为块实际上只是对象时,它应该变得更加清晰。您需要将块复制到堆中,但是您需要将其视为您拥有所有权的所有其他对象。当取消分配在块上调用复制的对象时,您应该释放对块的所有权。