1

我在使用该[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 没有问题)

4

1 回答 1

0

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

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

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

此外,EXEC_BAD_ACCESS 可能是发送给已释放实例的消息,因此启用僵尸将是获取有关正在向哪些已释放事物发送消息的更多信息的第一步。

于 2013-01-08T06:43:33.377 回答