我允许用户选择一个位置,并希望在另一个屏幕上测试它:
if (myManager.centerOfMap == (id)[NSNull null]) {
self.centerOfMap = myManager.centerOfMap;
}
但是我知道上面的内容不对,因为它给了我一个指针转换警告。
然后我试着这样做:
if (CLLocationCoordinate2DIsValid(*(myManager.centerOfMap))) {
self.centerOfMap = myManager.centerOfMap;
}
但是我的程序由于EXC_BAD_ACCESS而崩溃,因为myManager.centerOfMap没有第一次设置。如何让它让我知道CLLocationCoordinate2D是否已被赋值?
答案 0 :(得分:2)
你试过了吗?
if (CLLocationCoordinate2DIsValid(myManager.centerOfMap)) {
self.centerOfMap = myManager.centerOfMap;
}
此外,在您的myManager
课程中,您可能希望确保在课程初始化时将centerOfMap
设置为无效的CLLocationCoordinate2D
值。这样你就可以肯定它开始时的值无效。
答案 1 :(得分:2)
请注意NSNull
实际上是一个(单例)对象。想法是在你想拥有一个空值对象时使用它(即你不能只使用一个nil值或指针)。例如,作为NSDictionary
中的对象。这不是你在这里寻找的。 p>
如果centerOfMap
被创建为CLLocationCoordinate2D
,这只是一个简单的结构,而不是一个对象。请注意,您将创建如下:
CLLocationCoordinate2D centerOfMap;
不喜欢这样:
CLLocationCoordinate2D *centerOfMap;
CLLocationCoordinate2D结构定义如下:
typedef struct {
CLLocationDegrees latitude;
CLLocationDegrees longitude;
} CLLocationCoordinate2D;
因此,如果您想知道这个中的给定值是否合适,您需要执行以下操作之一:
1)有一个单独的成员变量,说明是否添加了有效位置。例如,BOOL retrievedCenterOfMap
。然后在配置centerOfMap时将其设置为YES,那么您的测试将变为:
if ([myManager retrievedCenterOfMap]) {
self.centerOfMap = myManager.centerOfMap;
}
2)在centerOfMap
变量中设置已知的无效值。 CLLocationCoordinate2DIsValid()
会告诉您centerOfMap
值是否有效,无论它是否是有效坐标,但您应该区别于是否实际设置了它!那么问题就变成了你应该使用的无效值,并且将来检查你的代码的任何人都知道你在这里做了什么。
答案 2 :(得分:0)
您没有说,但我认为,因为您将其传递给CLLocationCoordinate2DIsValid
,myManager.centerOfMap
类型为(CLLocationCoordinate2D *)
。 CLLocationCoordinate2D
是一个结构而不是Objective-C对象。如果myManager.centerOfMap
实际上是指向CLLocationCoordinate2D
的指针,则首先需要检查它是否为NULL,然后检查它是否有效:
if (myManager.centerOfMap && CLLocationCoordinate2DIsValid(*(myManager.centerOfMap))) {
self.centerOfMap = myManager.centerOfMap;
}
但是,您可能会发现直接存储CLLocationCoordinate2D比在实例变量中指向它们更容易。