实例变量不保留值

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 很高兴我能帮上忙。如果事实证明可以解决您的问题,请单击复选标记以接受此答案。

以上是关于实例变量不保留值的主要内容,如果未能解决你的问题,请参考以下文章

属性存取直接访问实例变量

ARC 实例变量保留释放

在每个实例的 WCF 应用程序中保留一个变量

本地 和 实例 变量之间有啥区别

118 - 进程实例 07

Java 实例变量与局部变量