Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 碰撞块和核心运动_Iphone_Cocoa Touch_Accelerometer_Release Management_Objective C Blocks - Fatal编程技术网

Iphone 碰撞块和核心运动

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]

我正在使用Core Motion推送处理器更新加速度计:

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时,我实际上试图释放堆栈块而不是堆块。这当然会导致崩溃。这会导致问题:)块管理有时有点奇怪,但你能掌握它的窍门