4

[block copy]実行後、block();設定すればいいのblock=nil?それとも、ARC が既にこれを管理してくれるので、何もする必要はありませんか? ここでARCがブロック参照を管理する方法について少し混乱しています。ブロックをnilに設定すると何かが壊れるかどうかわかりませんか?

私はこのようなものを持っています。何かご意見は?

typedef void (^C3Block)(void);    // declare block, no return, no args

// set flag to get _previewImage, then call the block
- (void)takePreviewImageFromBufferWithBlock:(C3Block)block {
    _takePreviewImageBlock = [block copy]; // save block ref for calling later
    _shouldTakePreviewImageFromBuffer = YES;
}

- (void)gotPreviewImageFromBuffer {
    _takePreviewImageBlock(); // calls the block
    _takePreviewImageBlock = nil; // <---- should I do this???
}
4

3 に答える 3

2

が強い_takePreviewImageBlock属性を持つプロパティである場合、このプロパティを含むオブジェクトが存在する限り、ARC はそれを保持します。 @Eugene で述べたように、呼び出し後にリセットされます。 この動作を理解したら、設計に適合するかどうかを判断する必要があります。所有者がすぐに割り当て解除される場合、そのプロパティを自分で nil する必要はありません。それ以外の場合、このブロックがロジックに関連しなくなり、正当な理由もなくメモリ内に留まる場合は、nil にする必要があります。
takePreviewImageFromBufferWithBlock:

于 2013-01-31T19:33:37.620 に答える
2

一般に、ブロック iVar を nil に設定しても意味がありません。これは、連続した-takePreviewImageFromBufferWithBlock:呼び出しでリセットする可能性が高いためです。メモリ管理の観点から_takePreviewBlockは、これは iVar であり、ARC によるその管理は他の iVar と同じです。所有者クラスの割り当てが解除されると、操作なしで適切に解放されます。

于 2013-01-31T19:28:59.477 に答える