2

ブロックを通過した後、グローバル変数に再びアクセスできない理由に困惑しています。これが私のコードです:

__block NSString *latitude;
__block NSString *longitude;

CLGeocoder *geoCoder = [[CLGeocoder alloc] init];
[geoCoder geocodeAddressString:location completionHandler:^(NSArray* placemarks, NSError* error) 
{
    for (CLPlacemark* aPlacemark in placemarks)
    {
        CLLocation *latLong = aPlacemark.location;
        latitude = [NSString stringWithFormat:@"%f", latLong.coordinate.latitude];
        longitude = [NSString stringWithFormat:@"%f", latLong.coordinate.longitude];
        //works fine
        NSLog(@"CLLOCATION SSSSSSSSSSSSSSSSSSSSSS LAT: %@, LONG: %@", latitude, longitude);           
    }
}];

//no bueno
NSLog(@"CLLOCATION SSSSSSSSSSSSSSSSSSSSSS LAT: %@, LONG: %@", latitude, longitude); 

NSString、さまざまな方法で s を初期化しようとしました。

__block NSString *latitude = @"";
__block NSString *longitude = @"";

と:

__block NSMutableString *latitude = [NSMutableString string];
__block NSMutableString *longitude = [NSMutableString string];

しかし、ブロックの外側の変数にアクセスしているときに、空の文字列を取得してしまいます。

Apple のドキュメントhttp://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1では、これは特に不可解です。

、ブロックの外側で変数を設定し、それらを使用し、それらをうまく取得できます。

4

1 に答える 1

1

Okie doke、いくつかの問題のように聞こえます(1つ、まったく、またはすべてが当てはまる場合があります。提供されたコンテキスト内で判断するのは困難です):

1 - 「しかし、ブロック外の変数にアクセスしているときに、空の文字列を取得してしまいます。」

ブロックの外側にいつアクセスするかによって異なります。これは、クエリ時に緯度と経度が入力されているという保証がないためです。提供されるブロックは、CLGeocoder の完了ハンドラーです。ジオコーダが対象の場所を見つけたときに呼び出されます。位置データを取得し、その位置に基づいて検索を行うには時間がかかり、直後の NSLog ステートメントは、「目印」が見つかる前に呼び出される可能性が高くなります。

2 - *「IOS5 __block 変数が EXC_BAD_ACCESS をスコープ外にスローする」*

ブロックで次を割り当てています。

latitude = [NSString stringWithFormat:@"%f", latLong.coordinate.latitude];
longitude = [NSString stringWithFormat:@"%f", latLong.coordinate.longitude];

stringWithFormat自動解放された値を返すメソッドですが、それらをどこにも保持していません。ARC を使用していない場合 (メモリ管理用語の ARCについては、 https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.htmlを参照してください。http://developer .apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html一般に)、存在しないオブジェクトにアクセスしているため、他の場所の値にアクセスするときに問題が発生します。ARC を使用している場合、変数はデフォルトで強力であり、値を保持するため、これは問題になりません。

于 2012-06-07T19:06:50.087 に答える