1

クラスでブロックを定義しました:

BXButton.h

typedef void(^ButtonClicked)(id sender, NSDictionary *userInfo);
@property (assign, nonatomic) ButtonClicked onButtonClicked;
- (void)setClickBlock:(ButtonClicked)buttonClicked;

BXButton.m

- (void)setClickBlock:(ButtonClicked)buttonClicked {
    onButtonClicked = buttonClicked;
}
- (void)internalButtonClicked {
    DLog(@"internal clicked");
    if (self.onButtonClicked) {
        onButtonClicked(self, self.userInfo);
    }
}

そして、View Controllerで次のように呼び出そうとしました:

[_testButton setClickBlock:^(BXButton *sender, NSDictionary *userInfo) {
        DLog(@"userInfo %@", userInfo);
        [sender startLoading];
        [[BXAPIClient sharedPublicClient]postPath:@"/" parameters:nil success:^(AFHTTPRequestOperation *operation, id responseObject) {
            [sender endLoading];
            //[safeSelf stop];
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            [sender endLoading];
            [self stop];
        }];
    }];

そして、[自己メソッド]またはブロック外で定義された変数にアクセスしようとするたびに、常にBAD_ACCESSを取得しました。何か案は?ありがとう!

4

1 に答える 1

11

取得する理由EXC_BAD_ACCESSは、ブロックがデフォルトでスタック上に作成されるためです。そのため、assignプロパティでそれらを参照すると、スタックが破棄されると単に存在しなくなります。

これを修正するには、ブロックをヒープにコピーする必要があります。これを行う 1 つの方法は、プロパティを定義するときcopyに代わりに使用することです。assign

宣言を次のように変更します

@property(copy, nonatomic) ButtonClicked onButtonClicked;

ブロックを割り当てるときにivarに直接アクセスする代わりに、セッター/ゲッターを使用します

- (void)setClickBlock:(ButtonClicked)buttonClicked {
    self.onButtonClicked = buttonClicked;
}
- (void)internalButtonClicked {
    DLog(@"internal clicked");
    if (self.onButtonClicked) {
        self.onButtonClicked(self, self.userInfo);
    }
}
于 2012-12-11T04:34:10.503 に答える