【问题标题】:CLGeocoder completionHandler with ARC always crashes (EXEC_BAD_ACCESS) in the completion handler block带有 ARC 的 CLGeocoder 完成处理程序总是在完成处理程序块中崩溃 (EXEC_BAD_ACCESS)
【发布时间】: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


【解决方案1】:

寻找解决方案,我发现这是由调用引起的 自我在块中。

这没有一点意义。首先,块中self 的常见问题是它保留了self,而self 保留了块,从而导致了保留循环。这里没有保留循环,因为self 没有对地理编码器的强引用。其次,即使有一个保留周期,它也会导致泄漏,绝不会崩溃。

您的代码有很多问题,包括在此函数返回后没有对地理编码器的强引用,因此它可能会被释放(启动的地理编码会发生什么,我不知道)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2015-08-30
    • 1970-01-01
    相关资源
    最近更新 更多