ObjecTips

Swift & Objective-C で iOS とか macOS とか

dispatch_block_t

dispatch/object.h に以下のような定義がある。

typedef void (^dispatch_block_t)(void);

自前の実装の中で

- (void)test
{
    void (^blockName)(void) = ^{
    };
}
@interface MyObject : NSObject
@property (nonatomic, copy) void (^blockName)(void);
@end

このように引数無し返り値無しのブロックの定義を行う際に、代わりに dispatch_block_t 型を使用する事ができる。

- (void)test
{
    dispatch_block_t blockName = ^{
    };
}
@interface MyObject : NSObject
@property (nonatomic, copy) dispatch_block_t blockName;
@end

このような使われ方はiOSの標準フレームワークではほとんどされていないが、iOS 8で登場した Photos.framework の PHPhotoLibrary

- (void)performChanges:(dispatch_block_t)changeBlock completionHandler:(void(^)(BOOL success, NSError *error))completionHandler;
- (BOOL)performChangesAndWait:(dispatch_block_t)changeBlock error:(NSError *__autoreleasing *)error;

これらのメソッドでは dispatch_block_t でのブロックが使用されている。
また Apple のサンプルコードでもたまにこの型の使用を見かける事ができる。