Pei*_*ong 1 objective-c objective-c-blocks
我在一个类中定义了一个块:
BXButton.h
typedef void(^ButtonClicked)(id sender, NSDictionary *userInfo);
@property (assign, nonatomic) ButtonClicked onButtonClicked;
- (void)setClickBlock:(ButtonClicked)buttonClicked;
Run Code Online (Sandbox Code Playgroud)
BXButton.m
- (void)setClickBlock:(ButtonClicked)buttonClicked {
onButtonClicked = buttonClicked;
}
- (void)internalButtonClicked {
DLog(@"internal clicked");
if (self.onButtonClicked) {
onButtonClicked(self, self.userInfo);
}
}
Run Code Online (Sandbox Code Playgroud)
我试图在视图控制器中这样调用:
[_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];
}];
}];
Run Code Online (Sandbox Code Playgroud)
每当我尝试访问[self method]或在块外部定义的任何变量时,我总是得到BAD_ACCESS.有任何想法吗?谢谢!
Gab*_*lla 11
你得到的原因EXC_BAD_ACCESS是因为默认情况下会在堆栈上创建块,所以如果你用assign属性引用它们,当堆栈被拆掉时它们就会停止存在.
为了解决这个问题,您应该将块复制到堆中.一种方法是使用copy而不是assign在定义属性时.
将您的声明更改为
@property(copy, nonatomic) ButtonClicked onButtonClicked;
Run Code Online (Sandbox Code Playgroud)
并且在分配块时使用其setter/getter而不是直接访问ivar
- (void)setClickBlock:(ButtonClicked)buttonClicked {
self.onButtonClicked = buttonClicked;
}
- (void)internalButtonClicked {
DLog(@"internal clicked");
if (self.onButtonClicked) {
self.onButtonClicked(self, self.userInfo);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2172 次 |
| 最近记录: |