实例变量不保留值
Posted
技术标签:
【中文标题】实例变量不保留值【英文标题】:Instance Variable Not Retaining Value 【发布时间】:2012-02-26 23:25:08 【问题描述】:我正在尝试使用 CLGeocoder 对象转发 ios 5 中的地址,并将生成的 CLLocation 放入实例变量中。出于某种原因,我可以设置实例变量,然后调用它的 getter,但该变量会在地理编码器的完成处理程序范围之外丢失其值。
我在 .h 文件中声明了变量:
@property (nonatomic, strong) CLLocation *specifiedPosition;
然后在我的.m中合成:
@synthesize specifiedPosition = _specifiedPosition;
然后尝试像这样使用地理编码器 - 第一个 NSLog 返回纬度和经度,而第二个不返回:
-(void)getLatLong:(NSString *)locationText
if (!self.geocoder)
self.geocoder = [[CLGeocoder alloc] init];
[self.geocoder geocodeAddressString:locationText completionHandler:^(NSArray *placemarks, NSError *error)
if ( ([placemarks count] > 0) && (error == nil))
self.specifiedPosition = [[placemarks objectAtIndex:0] location];
NSLog(@"Specified Location variable is set to: %@", self.specifiedPosition);
else if (error == nil && [placemarks count] == 0)
// TODO
NSLog(@"Can't find data on the specificed location");
else if (error != nil)
// TODO
NSLog(@"An error occurred = %@", error);
];
NSLog(@"Specified Location variable is set to: %@", self.specifiedPosition);
我也尝试了自定义设置器,但没有帮助:
-(void)setSpecifiedPosition:(CLLocation *)specifiedPosition
_specifiedPosition = specifiedPosition;
提前感谢您的帮助!
【问题讨论】:
【参考方案1】:我不熟悉这个特定的 API,但它占用了一个名为 completionHandler
的块这一事实非常强烈地表明这是一个异步操作。也就是说,您的块将被调用稍后(从运行循环)。源代码中的第二个NSLog
发生在之前completionHandler
被调用,所以它当然看不到分配,因为它还没有发生。
获得指定位置数据后,无论您需要做什么,都应该在 completionHandler
块内、-setSpecifiedPosition:
内或由其中之一通知/触发/调用的其他地方进行。
【讨论】:
我认为这是正确的 - 查看时间戳会发现它们出现故障。谢谢!!! @AlexSBerman 很高兴我能帮上忙。如果事实证明可以解决您的问题,请单击复选标记以接受此答案。以上是关于实例变量不保留值的主要内容,如果未能解决你的问题,请参考以下文章