【发布时间】:2013-01-07 20:59:18
【问题描述】:
我在使用[CLGeocoder geocodeAddressString:completionHandler:] 方法对Address string 进行地理编码时遇到问题。在 iOS 5 上运行的应用程序总是在 completion handler block 中崩溃 (EXEC_BAD_ACCESS)。
- (void)geocodeLocationComponents:(NSDictionary *)location
{
CLGeocoder *geocoder = [[CLGeocoder alloc] init];
NSString *searchString = [self stringFromLocation:location
forStage:self.stage];
[geocoder geocodeAddressString:searchString
completionHandler:^(NSArray *placemarks, NSError *error) {
self.stage++;
if (!error &&
placemarks &&
placemarks.count > 0) {
[self.delegate geocoder:self
didFinishCodingWithPlacemark:[placemarks objectAtIndex:0]];
} else {
...
}
}];
}
寻找解决方案,我发现这是由于在块中调用 self 引起的。提到的解决方案(对于 ARC!)是创建一个弱引用,就像那样
__weak MyClass *blockSaveSelf = self;
并在块中调用它。我试过了,但这个参考总是零。 顺便说一句,为什么只有在 iOS5 上运行才会出现这种情况? (iOS 6 没有问题)
【问题讨论】:
-
如果是
nil,则表示创建块的类已被释放。
标签: objective-c ios xcode cocoa-touch