3

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

インスタンス変数に保存して後の段階で使用したいサードパーティのメソッドから受け取ったブロックがあります。

4

2 に答える 2

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
于 2012-04-27T02:55:18.347 に答える
2

参照してくださいBlocks Programming Topics:

C 関数を使用して、ブロックをコピーおよび解放できます。

Block_copy();
Block_release();

Objective-C を使用している場合は、ブロックcopyretain、およびrelease(およびautorelease) メッセージを送信できます。

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

于 2012-04-27T01:17:39.313 に答える