ブロックを受け入れるグローバル(プライベートインスタンス変数)をどのように宣言しますか?我々はそれを合成する必要がありますか?&それに伴うメモリ管理の影響は何ですか?インスタンス変数にブロックを保存する
インスタンス変数&に保存するサードパーティメソッドから受け取ったブロックを、後で使用します。
ブロックを受け入れるグローバル(プライベートインスタンス変数)をどのように宣言しますか?我々はそれを合成する必要がありますか?&それに伴うメモリ管理の影響は何ですか?インスタンス変数にブロックを保存する
インスタンス変数&に保存するサードパーティメソッドから受け取ったブロックを、後で使用します。
ここでは、バックグラウンドでいくつかの仕事をした後、完了コールバックのためのブロックを格納する(ARC-以下)の例です:
Worker.h:
@interface Worker : NSObject
{
void (^completion)(void);
}
@property(nonatomic,copy) void (^completion)(void);
- (void)workInBackground;
@end
Worker.m:
は@implementation Worker
@synthesize completion;
- (void)dealloc
{
Block_release(completion);
[super dealloc];
}
- (void)setCompletion:(void (^)(void))block
{
if (completion != NULL)
Block_release(completion);
completion = Block_copy(block);
}
- (void)workInBackground
{
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void)
{
// Do work..
dispatch_async(dispatch_get_main_queue(), completion);
});
}
@end
Blocks Programming Topics
を参照してください:あなたはObjective-Cのを使用している場合は、ブロックcopy
を送ることができます
Block_copy();
Block_release();
retain
、そして:あなたがCの関数を使用してブロックをコピーして、解放することができ
release
(およびautorelease
)メッセージメモリリークを避けるには、
Block_copy()
と常にBlock_release()
の間にバランスをとる必要があります。ガベージコレクション環境でない限り、copy
またはretain
とrelease
(またはautorelease
)とのバランスを取る必要があります。
これは問題ありません。同じコントローラクラスの中で、あるメソッドで受け取ったブロックを保存して、後で別のメソッドで使用できるようにしたい。どうすればいいですか?私はいくつかのインスタンス変数にブロックを保存し、それを後で使用することを考えました。 – Abhinav
ARC環境でも 'retain'、' release'、 'autorelease'を使うことはできません。 – Abizern
http://stackoverflow.com/questions/8360998/beginsheet-block-alternative-with-arcおよびhttp://stackoverflow.com/questions/9701923/arc-bridge-cast-block-copy-block-releaseを参照してください。あなたはARCを使用しています。 – Hailei