ブロックを受け入れるためにグローバル(プライベートインスタンス変数)を宣言するにはどうすればよいですか。それを合成する必要がありますか?それによるメモリ管理への影響は何ですか?
インスタンス変数に保存して後の段階で使用したいサードパーティのメソッドから受け取ったブロックがあります。
ブロックを受け入れるためにグローバル(プライベートインスタンス変数)を宣言するにはどうすればよいですか。それを合成する必要がありますか?それによるメモリ管理への影響は何ですか?
インスタンス変数に保存して後の段階で使用したいサードパーティのメソッドから受け取ったブロックがあります。
バックグラウンドでいくつかの作業を行った後、完了コールバックのブロックを格納する (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
:
C 関数を使用して、ブロックをコピーおよび解放できます。
Block_copy(); Block_release();
Objective-C を使用している場合は、ブロック
copy
、retain
、およびrelease
(およびautorelease
) メッセージを送信できます。メモリ リークを回避するには、常に と のバランスを取る必要があり
Block_copy()
ますBlock_release()
。copy
orretain
とrelease
(または) のバランスを取る必要がありますautorelease
— ガベージ コレクション環境でない限り。