1

加速度センサーの更新に Core Motion のプッシュ ハンドラーを使用しています。

CMAccelerometerHandler accelerometerHandler = ^ (CMAccelerometerData *accelerometerData, NSError *error) {
    // handle update
};

[motionManager startAccelerometerUpdatesToQueue:[NSOperationQueue mainQueue]
                                    withHandler:[[accelerometerHandler copy] autorelease]];

このコードはクラッシュします。ブロックをまったくコピーしないと、一時停止/再開時に断続的にクラッシュします。外すと正常にautorelease動作しますが、漏れが発生すると思います。

また、ブロックをivarに割り当て、後に解放しようとしました[motionManager stopAccelerometerUpdates]。同様にクラッシュします。

どうして?copy/retainと / のreleaseバランスを取る必要があるといつも思っていましたautorelease

参照: Objective-C でのブロックのコピー (つまり、インスタンス変数へのコピー)

4

1 に答える 1

1

ここでの問題は、ブロックに対する所有権です。ブロックが実際には単なるオブジェクトであると考えると、これがどのように機能する必要があるかがより明確になるはずです。ブロックをヒープにコピーする必要がありますが、所有権を持っている他のすべてのオブジェクトと同じように扱う必要があります。ブロックでコピーを呼び出したオブジェクトの割り当てが解除されたら、ブロックの所有権を解放する必要があります。

于 2010-11-12T17:45:19.040 に答える