1

我正在使用 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

另请参阅:在 Objective-C 中复制块(即:将它们复制到实例变量)

4

1 回答 1

1

这里的问题是对区块的所有权。当您认为块实际上只是对象时,应该更清楚这一切需要如何工作。您确实需要将块复制到堆中,但是您需要像对待您拥有所有权的所有其他对象一样对待它。当在块上调用副本的对象被释放时,您应该释放对该块的所有权。

于 2010-11-12T17:45:19.040 回答