基于位置的应用程序调试

Posted

技术标签:

【中文标题】基于位置的应用程序调试【英文标题】:Location based application debugging 【发布时间】:2012-01-04 21:10:38 【问题描述】:

我正在尝试制作一个基于位置的应用程序,并且我已经尝试调试了 3 天,但仍然无法找出问题所在...在我的视图控制器中,我通过了一些位置点(纬度和经度)通过委托方法:

- (void)locationManager:(CLLocationManager *)manager    didUpdateToLocation:(CLLocation *)newLocation           fromLocation:(CLLocation *)oldLocation
    currentPoint.lat=newLocation.coordinate.latitude*M_PI/180;
    currentPoint.longit=newLocation.coordinate.longitude*M_PI/180;

currentPoint 是我创建的 Pointxy 类中的一个对象,它只不过是一个具有两个属性 lat 和 longit 的对象。

然后我创建了另一个名为 Shape 的类,它有一个 NSMutableArray (ptArray) 和一个名为 area 的属性,它是一个 long double。

然后我将一堆尖头对象存储在 ptArray 中,然后在以下 Shape 方法中使用它们:

-(void)CalculateArea
for (int i=0; i<[self NumberofPoints]-1; i++) 
    Pointxy *pointi=[ptArray objectAtIndex:i];
    Pointxy *pointiplus1=[ptArray objectAtIndex:i+1];
    area-=6371.0*6371.0/2.0*(pointiplus1.longit-pointi.longit)*(2+sinf(pointiplus1.lat)+sinf(pointi.lat));

Pointxy *pointzero=[ptArray objectAtIndex:0];
Pointxy *pointlast=[ptArray objectAtIndex:[ptArray count]-1];

area-=6371.0*6371.0/2.0*(pointzero.longit-pointlast.longit)*(2+sinf(pointzero.lat)+sinf(pointlast.lat));
area=area*1000000.0;
    

我遇到的问题是我尝试使用此代码在 UILabel 中显示区域:

NSString *AreaString=[[NSString alloc]initWithFormat:@"%Lf",MyShape.area];
    [AreaLabel setText:AreaString];

其中 MyShape 是一个 Shape 对象,AreaLabel 是一个 UILabel,我总是显示 0.0000,我不应该让任何人看到为什么?我想这可能是我的变量的精度问题,是吗? 非常感谢

【问题讨论】:

坐标以度为单位,无需从弧度转换。您是否尝试过打印使用 NSLog 获得的坐标?您是否使用已知的良好数据对您的 CalculateArea 函数进行了单元测试? 我还没有测试过,但我的来源是美国航空航天局的一篇论文:trs-new.jpl.nasa.gov/dspace/bitstream/2014/40409/1/07-03.pdf 所以应该没有任何错误。无论如何,即使有同样的错误,它怎么可能总是返回零?我将它转换为弧度以在 sinf() 函数中使用它...是的,我实际上有一个标签,可以实时显示存储在数组中的坐标谢谢。 @user611295:NASA 的论文可能没有任何错误,但需要检查和测试的是您的算法实现。此外,在 Objective-C 中,即使区域算法代码正确,也有很多方法可以得出零答案。如果您正在使用的某些对象没有被分配 + 初始化,它们将是 nil 导致无操作。示例:如果 MyShape 为 nil,MyShape.area 将返回零。如果 ptArray 为 nil 或为空,您将得到零。等等。正如 progrmr 所建议的,您需要添加日志记录并进行单元测试。 我完全确定数组不为空,因为我有一个打印 [ptarray count] 的标签;我也完全确定存储在其中的 pointxy 对象确实是有效的对象,因为我有一个标签,在添加一个点后会显示最后一个点 lat 和 longit。无论如何,如果我的数组或我的形状是 nil 对象,我的应用程序会在调用它不调用的 CalculateArea 方法时崩溃。谢谢 这可能不是您的问题,但请注意,在 Objective-C 中,在 nil 对象上调用方法不会导致崩溃。见***.com/questions/156395/sending-a-message-to-nil。 【参考方案1】:

我刚刚发现我的错误。我打电话给 [ptArray addObject:currentPoint];,其中currentPoint 是一个pointxy 实例。

事情是在那之后我为currentPoint.latlongit 分配了一个新值,但是由于addObject 方法在我更改值时通过引用传递了对象,因此数组对象中的值也发生了更改,然后我又一次添加了currentPoint,但由于它是通过引用传递的,我现在在我的数组中有一组相等的点,这些点内的图形内部区域确实为零!

【讨论】:

以上是关于基于位置的应用程序调试的主要内容,如果未能解决你的问题,请参考以下文章

在多次运行中调试具有相同内存地址位置的程序?

小程序调试技术详解(基于小猴小程序)

小程序调试技术详解(基于小猴小程序)

小程序调试技术详解(基于小猴小程序)

小程序调试技术详解(基于小猴小程序)

如何使用 Chrome 开发工具调试基于 v8 的远程应用程序