Iphone 碰撞块和核心运动
我正在使用Core Motion推送处理器更新加速度计:Iphone 碰撞块和核心运动,iphone,cocoa-touch,accelerometer,release-management,objective-c-blocks,Iphone,Cocoa Touch,Accelerometer,Release Management,Objective C Blocks,我正在使用Core Motion推送处理器更新加速度计: CMAccelerometerHandler accelerometerHandler = ^ (CMAccelerometerData *accelerometerData, NSError *error) { // handle update }; [motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]
CMAccelerometerHandler accelerometerHandler = ^ (CMAccelerometerData *accelerometerData, NSError *error) {
// handle update
};
[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]
withHandler:[[accelerometerHandler copy] autorelease]];
此代码崩溃。如果我根本不复制块,我会在挂起/恢复时间歇性崩溃。如果我删除自动释放
,它可以正常工作,但我认为这会产生泄漏
我还尝试将块分配给ivar,并在[motionManager StopAccelerometerUpdate]
之后释放它。也会发生车祸
怎么会这样?我一直认为我必须平衡任何复制
/保留
和发布
/自动释放
另请参见:这里的问题是区块的所有权。当你认为块实际上只是对象时,它应该变得更加清楚这是如何工作的。您确实需要将块复制到堆中,但是您需要像对待其他拥有所有权的对象一样对待它。解除分配块上调用copy的对象时,您应该释放对该块的所有权。这里的问题是对该块的所有权。当你认为块实际上只是对象时,它应该变得更加清楚这是如何工作的。您确实需要将块复制到堆中,但是您需要像对待其他拥有所有权的对象一样对待它。当在块上调用copy的对象被解除分配时,您应该释放对该块的所有权。好的,愚蠢的我。当我尝试我描述的ivar方法时,我将块文本分配给ivar,然后调用
[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]和Handler:[[accelerometerHandler copy]]
。因此,当我释放ivar时,我实际上试图释放堆栈块而不是堆块。这当然会崩溃。这会导致问题:)块管理有时有点奇怪,但你知道伊托克的窍门,愚蠢的我。当我尝试我描述的ivar方法时,我将块文本分配给ivar,然后调用[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]with handler:[[accelerometerHandler copy]]
。因此,当我释放ivar时,我实际上试图释放堆栈块而不是堆块。这当然会导致崩溃。这会导致问题:)块管理有时有点奇怪,但你能掌握它的窍门