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;

そしてそれをブロックで呼び出します。試してみましたが、この参照は常に nil です。ところで、なぜこれは iOS5 でのみ発生するのでしょうか? (iOS 6では問題ありません)

4

1 に答える 1

0

解決策を探していると、これはブロック内で self を呼び出すことが原因であることがわかりました。

これは少し意味がありません。まず、ブロック内の通常の問題selfは、ブロックを保持してself保持selfし、保持サイクルを引き起こすことです。ここではself、ジオコーダへの強い参照がないため、保持サイクルはありません。次に、保持サイクルがあったとしても、リークが発生し、クラッシュすることはありません。

あなたのコードには、この関数が返された後にジオコーダーへの強い参照がないなど、多くの問題があるため、おそらく割り当てが解除されます (開始されたジオコーディングに何が起こるか、私にはわかりません)。

また、EXEC_BAD_ACCESS は、割り当て解除されたインスタンスへのメッセージである可能性が高いため、ゾンビを有効にすることは、割り当て解除されたものについてメッセージが送信されていることに関する詳細情報を取得するための最初のステップになります。

于 2013-01-08T06:43:33.377 に答える