Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa touch 在Xcode中正确调试(cocoa touch)_Cocoa Touch_Xcode - Fatal编程技术网

Cocoa touch 在Xcode中正确调试(cocoa touch)

Cocoa touch 在Xcode中正确调试(cocoa touch),cocoa-touch,xcode,Cocoa Touch,Xcode,我的应用程序委托中有一个实例变量lat(NSString)。我要做的是将此变量设置为用户在didUpdateToLocation:fromLocation中的当前纬度,以便我可以从其他视图访问它。这是关键。所以我有这个代码: - (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldL

我的应用程序委托中有一个实例变量
lat
(NSString)。我要做的是将此变量设置为用户在
didUpdateToLocation:fromLocation
中的当前纬度,以便我可以从其他视图访问它。这是关键。所以我有这个代码:

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation
       fromLocation:(CLLocation *)oldLocation {

    appDelegate = (myProjectAppDelegate *)[[UIApplication sharedApplication] delegate];

    appDelegate.lat = [[NSString alloc] initWithFormat:@"%g",newLocation.coordinate.latitude];
}
在调试方面,当我在控制台中执行
po appDelegate.lat
时,当在此处设置断点时,我可以很好地看到值。当我转到要使用该值的ViewController时,当我将鼠标悬停在其上时,
超出范围
,当我尝试
po appDelegate.lat
时,
无法访问0x0处的内存。这来自视图控制器:

    [appDelegate.locMan startUpdatingLocation];

    NSLog(@"here");
    NSLog(appDelegate.lat);
由于没有为我的
NSLog(appDelegate.lat)
语句打印任何内容,因此我只能假设出了问题

正确的调试方法是什么


谢谢。

可能需要查看更多代码,但听起来您可能没有保留viewController的appDelegate属性。当然,消息
无法访问0x0处的内存
意味着一个空指针

如果可以在应用程序委托中看到
lat
属性,但在viewController中看不到该属性,则问题在于appDelegate和viewController之间的链接。如果可以在viewController的一种方法中看到
.lat
,但在另一种方法中看不到,则表明viewController的
appDelegate
属性未正确保留


Edit01: 应该补充的是,您可以设置一个断点来记录日志并在

@synthesize lat;
appDelegate源文件中的行。每次调用一个综合访问器/设置器时,都会记录此日志。这将告诉您何时实际访问或设置了属性。您可以在同一断点上使用调试器函数来打印lat的值


如果需要更多信息,可以写出显式的accessor/setter方法,并将log语句放入其中。我怀疑在这种情况下你需要走那么远

如果没有更多的代码和一些假期遗留问题,看起来您正在获取应用程序委托的本地副本并在其上设置lat ivar,并且应用程序委托的本地副本在退出时被销毁(以及您在其上设置的lat ivar),因此当您稍后尝试获取lat值时,您将获得空指针内容

我发现在Cocoa类型的应用程序中,在对象上生成getter/setter最好是将数据从一个对象传递到另一个对象

在应用程序委托上创建一个“setter”方法,该方法接受lat值,在内部将其设置为受保护属性中的应用程序委托对象,最后生成一个单独的“getter”方法,该方法仅从应用程序委托返回lat值。或者将setter/getter方法放在应用程序中有意义的任何对象上

对于setter和getter,命名约定通常分别为:“setNAMEOFVAR”和“getNAMEOFVAR”


这应该适合您。

上面的代码实际上是正确的。您正在将消息传递给应用程序代理singleton,当然不希望保留对它的强引用

如果没有更多的代码,查看程序流程有点困难,但看起来您正在将startUpdatingLocation传递给从应用程序委托子类引用的LocationManager。首先,我要检查LocationManager的委托是否设置为第二个代码段所在的类,否则它将永远不会被命中。然而,它看起来就像您在NSLog语句中看到的更新一样

其次,我记得LocationManager将异步更新。不要期望在开始更新位置后立即收到更新。因此,在开始更新位置后的几秒钟内,lat将为零是非常合理的

第三,我将看到另一个控制器(您正在尝试读取结果)。当您尝试获取应用程序委托时,是否在类中处于断点处


顺便说一句,你的应用程序架构看起来有点(对不起)难看。有没有理由让你的应用程序代理和控制器如此紧密地结合在一起?一个更优雅的方法可能是创建一个自己的位置管理单例,并让它发布通知。任何感兴趣的类都可以订阅这些位置更新通知。

谢谢。据我所见,lat只合成了一次。我使用了appDelegate=[…sharedApplication]以前在其他类中使用符号来设置数组对象,然后从我现在使用的同一个视图控制器访问它们,可以做到这一点。所以我认为使用相同的想法来设置lat会起作用,因为应该保留对象,不是吗?我认为这是正确的。Joec应该在任何地方使用
self.appDelegate
,以确保其正确我试图添加一个受保护的属性,并创建了setter和getter,但它仍然返回一个空指针。还有其他方法传递这些值吗?