1

我允许用户选择一个位置并希望在另一个屏幕中对其进行测试:

 if (myManager.centerOfMap == (id)[NSNull null]) {
        self.centerOfMap = myManager.centerOfMap;
    } 

但是我知道上面是不对的,因为它给了我一个指针转换警告。

然后我尝试这样做:

 if (CLLocationCoordinate2DIsValid(*(myManager.centerOfMap))) {
        self.centerOfMap = myManager.centerOfMap;
    } 

但是我的程序由于 EXC_BAD_ACCESS 而崩溃,因为 myManager.centerOfMap 没有第一次设置。如何制作它以便让我知道 CLLocationCoordinate2D 是否已被赋值?

4

3 回答 3

2

你有没有尝试过:

if (CLLocationCoordinate2DIsValid(myManager.centerOfMap)) {
    self.centerOfMap = myManager.centerOfMap;
}

此外,在您的myManager班级中,您可能希望确保在班级初始化时设置centerOfMap为无效值。CLLocationCoordinate2D这样您就可以确定它以无效值开头。

于 2012-07-19T17:38:15.530 回答
2

请注意,这NSNull实际上是一个(单例)对象。这个想法是在你想要一个空值对象时使用它(即你不能只使用一个空值或指针)。例如,作为NSDictionary. 这不是您要在这里寻找的东西。

如果您centerOfMap创建为 aCLLocationCoordinate2D这只是一个简单的结构,而不是一个对象。请注意,您将像这样创建它:

CLLocationCoordinate2D centerOfMap;

不像这样:

CLLocationCoordinate2D *centerOfMap;

CLLocationCoordinate2D 结构定义如下:

typedef struct {
    CLLocationDegrees latitude;
    CLLocationDegrees longitude;
} CLLocationCoordinate2D;

因此,如果您想知道其中的给定值是否合适,您需要执行以下操作之一:

1) 有一个单独的成员变量,说明是否添加了有效位置。例如,BOOL retrievedCenterOfMap。然后在配置 centerOfMap 时将其设置为 YES,那么您的测试变为:

if ([myManager retrievedCenterOfMap]) {
    self.centerOfMap = myManager.centerOfMap;
} 

centerOfMap2) 在变量 中设置已知的无效值。CLLocationCoordinate2DIsValid()将告诉您该centerOfMap值是否有效,它是否是有效坐标,但您应该将其与您是否实际设置它区分开来!然后问题就变成了您应该使用什么无效值,并且将来检查您的代码的任何人都会知道您在这里做了什么。

于 2012-07-19T17:45:40.327 回答
0

你没有说,但我认为因为你将它传递给CLLocationCoordinate2DIsValidthatmyManager.centerOfMap是 type (CLLocationCoordinate2D *)CLLocationCoordinate2D是一个结构而不是一个 Objective-C 对象。如果myManager.centerOfMap真的是指向您的指针,CLLocationCoordinate2D您首先需要检查它是否为 NULL,然后检查它是否有效:

 if (myManager.centerOfMap && CLLocationCoordinate2DIsValid(*(myManager.centerOfMap))) {
    self.centerOfMap = myManager.centerOfMap;
 } 

但是,您可能会发现直接存储 CLLocationCoordinate2D 而不是将指向它们的指针存储在实例变量中更容易。

于 2012-07-19T17:44:50.860 回答