【问题标题】:Crash with Blocks and Core Motion块和核心运动崩溃
【发布时间】:2010-11-12 15:35:25
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 好吧,我傻了。当我尝试我描述的 ivar 方法时,我将块文字分配给 ivar,然后调用 [motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue] withHandler:[[accelerometerHandler copy]]。因此,当我释放 ivar 时,我实际上试图释放堆栈块而不是堆块。当然会崩溃。
    • 这会导致问题 :) 块管理有时有点奇怪,但你掌握了它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-09
    • 2014-08-07
    • 2023-03-14
    • 2018-09-02
    相关资源
    最近更新 更多