2012-04-27 18 views
3

ブロックを受け入れるグローバル(プライベートインスタンス変数)をどのように宣言しますか?我々はそれを合成する必要がありますか?&それに伴うメモリ管理の影響は何ですか?インスタンス変数にブロックを保存する

インスタンス変数&に保存するサードパーティメソッドから受け取ったブロックを、後で使用します。

答えて

12

ここでは、バックグラウンドでいくつかの仕事をした後、完了コールバックのためのブロックを格納する(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 
2

Blocks Programming Topicsを参照してください:あなたはObjective-Cのを使用している場合は、ブロックcopyを送ることができます

Block_copy(); 
Block_release(); 

retain、そして:あなたがCの関数を使用してブロックをコピーして、解放することができ

release(およびautorelease)メッセージ

メモリリークを避けるには、Block_copy()と常にBlock_release()の間にバランスをとる必要があります。ガベージコレクション環境でない限り、copyまたはretainrelease(またはautorelease)とのバランスを取る必要があります。

+0

これは問題ありません。同じコントローラクラスの中で、あるメソッドで受け取ったブロックを保存して、後で別のメソッドで使用できるようにしたい。どうすればいいですか?私はいくつかのインスタンス変数にブロックを保存し、それを後で使用することを考えました。 – Abhinav

+0

ARC環境でも 'retain'、' release'、 'autorelease'を使うことはできません。 – Abizern

+0

http://stackoverflow.com/questions/8360998/beginsheet-block-alternative-with-arcおよびhttp://stackoverflow.com/questions/9701923/arc-bridge-cast-block-copy-block-releaseを参照してください。あなたはARCを使用しています。 – Hailei

関連する問題