代码之家  ›  专栏  ›  技术社区  ›  Ortwin Gentz

撞块和核心运动

  •  1
  • Ortwin Gentz  · 技术社区  · 14 年前

    我正在使用核心运动的推送处理程序来更新加速度计:

    CMAccelerometerHandler accelerometerHandler = ^ (CMAccelerometerData *accelerometerData, NSError *error) {
        // handle update
    };
    
    [motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]
                                        withHandler:[[accelerometerHandler copy] autorelease]];
    

    此代码崩溃。如果我根本不复制这个块,我会在suspend/resume时间歇性崩溃。如果我移除 autorelease 它工作得很好,但我想这会造成泄漏。

    我还试着把这个块分配给一个ivar,然后在 [motionManager stopAccelerometerUpdates] . 撞车也一样。

    怎么了?我一直认为我必须平衡 copy / retain 用一个 release / 自动释放酶 ?

    另见: Copying blocks (ie: copying them to instance variables) in Objective-C

    1 回复  |  直到 7 年前
        1
  •  1
  •   Joshua Weinberg    14 年前

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