首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CLLocation成为coordinate.latitude的nan值

CLLocation成为coordinate.latitude的nan值
EN

Stack Overflow用户
提问于 2014-07-05 14:04:43
回答 1查看 442关注 0票数 1

我有一个视图控制器,它是显示地图视图的模型。因此,map视图在下面的代码中正确工作,但是有两个未使用的变量(long doubles x1,x2),当我删除它们时,CLLocation总是在第三次显示视图控制器时返回coordinate.latitude的nan值。temp1值将是nan第三次,从那时起。

为什么我需要这两个未使用的变量?,这是我的问题。

代码语言:javascript
复制
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    navigationItemTitle.prompt = name;

    if ([mapDict count] > 0)
    {
        id val = nil;
        NSArray *values = [mapDict allValues];
        long double x1, x2, temp1, temp2;  //x1, x2 unused but necessary

        for (int i = 0; i < [mapDict count]; i++)
        {
            val = [values objectAtIndex:i];

            temp1 += ((CLLocation *)val).coordinate.latitude;
            temp2 += ((CLLocation *)val).coordinate.longitude;                
        }

        temp1  /= [values count];
        temp2  /= [values count];

        //NSLog(@"%Lf", temp1);
        //NSLog(@"%Lf", temp2);

        CLLocationCoordinate2D centerCooordinate = CLLocationCoordinate2DMake(temp1, temp2);

        MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(centerCooordinate, 10000000, 10000000);
        [mapView setRegion:[mapView regionThatFits:region]];

        for(id key in mapDict)
        {
            id value = [mapDict objectForKey:key];

            MKPointAnnotation *point = [[MKPointAnnotation alloc] init];
            point.coordinate = ((CLLocation *)value).coordinate;
            point.title = key;
            point.subtitle = [NSString stringWithFormat:@"%f\t%f", point.coordinate.latitude, point.coordinate.longitude];

            [mapView addAnnotation:point];
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-05 14:46:54

temp1值仅是来自“第三次”视图控制器的NaN这一事实是一个巧合。

与实例变量不同,局部变量不会初始化为任何默认值。

如果你不初始化它们,它们就会有“随机”的值,这些值是基于它们当时在内存中的位置。

通过声明两个“未使用”变量,您只需更改temp1temp2的内存位置,这将导致它们的默认值略有不同。

为了避免这种不可预测性,您应该始终初始化局部变量。

在计算temp1temp2temp1循环之前添加这两行

代码语言:javascript
复制
temp1 = 0.0;
temp2 = 0.0;

顺便说一句,从iOS 7开始,只需在添加所有注释之后调用showAnnotations,就可以避免手动计算中心坐标。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24587206

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档