gpt4 book ai didi

IOS5 __block 变量在范围外抛出 EXC_BAD_ACCESS

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:51:04 26 4
gpt4 key购买 nike

我很困惑为什么我的全局变量在通过一个 block 后不能再次访问它。这是我的代码:

__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];

但是当我访问 block 外的变量时,我最终得到的是空字符串。

这特别令人困惑,因为在 Apple 的文档中 http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxGettingStarted.html#//apple_ref/doc/uid/TP40007502-CH7-SW1

,他们能够在 block 外设置变量,使用它们,并很好地检索它们。

最佳答案

Okie doke,听起来像是几个问题(一个、一个或全部都适用,很难在您提供的上下文中判断):

1 - “但是当我访问 block 外的变量时,我最终得到的是空字符串。”

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

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

您正在 block 中分配以下内容:

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,那么这应该不是问题,因为默认情况下变量将是强变量,并为您保留值。

关于IOS5 __block 变量在范围外抛出 EXC_BAD_ACCESS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10922505/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com