带有ARC的CLGeocoder completionHandler总是在完成处理程序块中崩溃(EXEC_BAD_ACCESS)

时间:2013-01-07 20:59:18

标签: objective-c ios xcode cocoa-touch

使用[CLGeocoder geocodeAddressString:completionHandler:]方法对Address string进行地理编码时遇到问题。在iOS 5上运行时,该应用始终会在(EXEC_BAD_ACCESS)中崩溃completion handler block

- (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没有问题)

1 个答案:

答案 0 :(得分:0)

  

寻找解决方案,我发现,这是由呼叫引起的   在街区自我。

这没有任何意义。首先,块中self的常见问题是它保留self并且self保留块,从而导致保留周期。这里没有保留周期,因为self没有对地理编码器的强引用。第二,即使存在保留周期,也会导致泄漏,绝不会崩溃。

您的代码存在许多问题,包括在此函数返回后没有任何强大的地理编码器引用,因此它可能会被解除分配(启动的地理编码会发生什么,我不知道)。

此外,EXEC_BAD_ACCESS可能是发布到已解除分配的实例的消息,因此启用僵尸将是获取有关正在发送的已解除分配内容的更多信息的第一步。