IOS5 __block变量在范围外抛出EXC_BAD_ACCESS

时间:2012-06-06 21:21:35

标签: ios ios5 mapkit

我很困惑为什么在经过一个块后我无法再次访问我的全局变量。这是我的代码:

__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

__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

,他们能够在块之外设置变量,使用它们并检索它们。

1 个答案:

答案 0 :(得分: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以及http://developer.apple.com/library/mac/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html),那么在访问其他地方的值时会出现问题,因为您正在访问不存在的对象更长的存在。如果您使用ARC,那么这应该不是问题,因为默认情况下变量会很强,并为您保留值。