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 - “但是当我访问块外的变量时,我只会得到空字符串。”

取决于您何时在块外访问它们。这是因为无法保证在查询时已填充纬度和经度。提供的块是 CLGeocoder 的完成处理程序;当地理编码器找到感兴趣的位置时,它将被调用。能够检索位置数据并基于该位置进行搜索需要时间,并且在找到任何“地标”之前直接调用 NSLog 语句的可能性很高。

2 - *“IOS5 __block 变量在范围外抛出 EXC_BAD_ACCESS”*

您在块中分配以下内容:

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

stringWithFormat是一种返回自动释放值的方法,但您不会将它们保留在任何地方。如果您没有使用 ARC(请参阅https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html以了解 ARC 的内存管理术语,以及http://developer .apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html通常),那么这将导致在访问其他地方的值时出现问题,因为您正在访问不再存在的对象。如果您使用的是 ARC,那么这应该不是问题,因为默认情况下变量会很强大,并为您保留值。

于 2012-06-07T19:06:50.087 回答