UIControlのカテゴリを作成し、UIbutton等のイベントハンドラをBlocksで受け取り
内部的にaddTargetすることで実現する。
ポイントはobjc_getAssociatedObjectを使って引数で受け取ったblocksをcopyして
自身に保持するところ。
categoryではインスタンス変数を保持出来ない問題を回避している。

以下、サンプルコード

------------------------------------------------------------------------------------------------------------
UIControl+UIControl_BlockCallBack.h
------------------------------------------------------------------------------------------------------------
#import <UIKit/UIKit.h>

@interface UIControl (UIControl_BlockCallBack)

- (void)addHandlerWithEvent:(UIControlEvents)event Block:(void (^)())block;
- (void)callBack:(id)sender;
@end

------------------------------------------------------------------------------------------------------------


UIControl+UIControl_BlockCallBack.h
------------------------------------------------------------------------------------------------------------
#import "UIControl+UIControl_BlockCallBack.h"
#import <objc/runtime.h>

@implementation UIControl (UIControl_BlockCallBack)

static const NSString *key = @"key";

-(void)addHandlerWithEvent:(UIControlEvents)event Block:(void (^)())block
{
    objc_setAssociatedObject(self, key, block, OBJC_ASSOCIATION_COPY);
    [self addTarget:self action:@selector(callBack:) forControlEvents:event];
}

- (void)callBack:(id)sender
{
    void (^block)() = objc_getAssociatedObject(self, key);
    if(block){
        block();
    }
}
@end

------------------------------------------------------------------------------------------------------------

使用例:
------------------------------------------------------------------------------------------------------------
    #import "UIControl+UIControl_BlockCallBack.h"
    ・
    ・
    ・

    UIButton *testButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    testButton.frame = CGRectMake(self.view.center.x-50.0, 20.0, 100.0, 50.0);
    [testButton setTitle:@"test" forState:UIControlStateNormal];
   
    [testButton addHandlerWithEvent:UIControlEventTouchUpInside Block:^{
        NSLog(@"Simple CallBack");
    }];

    [self.view addSubview:testButton];

------------------------------------------------------------------------------------------------------------