0

私はこの投稿UIBlockButtonのコードを使用しています:

typedef void (^ActionBlock)();

@interface UIBlockButton : UIButton {
  ActionBlock _actionBlock;
}

-(void) handleControlEvent:(UIControlEvents)event 
                 withBlock:(ActionBlock) action;

@implementation UIBlockButton

-(void) handleControlEvent:(UIControlEvents)event 
                 withBlock:(ActionBlock) action
{
  _actionBlock = Block_copy(action);
  [self addTarget:self action:@selector(callActionBlock:) forControlEvents:event];
}

-(void) callActionBlock:(id)sender{
  _actionBlock();
}

-(void) dealloc{
  Block_release(_actionBlock);
  [super dealloc];
}
@end

しかし、コードをARCの下に変更しました。すべてが正常に機能するようにコードを変更するにはどうすればよいですか?

4

1 に答える 1

3

ヘッダ:

@interface UIBlockButton : UIButton

- (void) handleControlEvent: (UIControlEvents) event withBlock: (dispatch_block_t) action;

@end

実装:

@interface UIBlockButton ()
@property(copy) dispatch_block_t actionBlock;
@end

@implementation UIBlockButton
@synthesize actionBlock;

- (void) handleControlEvent: (UIControlEvents) event withBlock: (dispatch_block_t) action
{
    [self setActionBlock:action];
    [self addTarget:self action:@selector(callActionBlock:) forControlEvents:event];
}

- (void) callActionBlock: (id) sender
{
    if (actionBlock) actionBlock();
}

@end

ただし、 を複数回呼び出すとhandleControlEvent:withBlock:ブロックが上書きされることに注意してください。この実装では、異なるイベントに対して異なるアクションを実行することはできません。UIまた、 Apple のコードとの潜在的な衝突を防ぐのではなく、おそらくクラスに別のプレフィックスを使用する必要があります。

于 2012-07-12T09:58:13.177 に答える