如何测试iOS中的空对象?

时间:2012-07-19 17:33:19

标签: ios cocoa-touch

我允许用户选择一个位置,并希望在另一个屏幕上测试它:

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

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

然后我试着这样做:

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

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

3 个答案:

答案 0 :(得分:2)

你试过了吗?

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

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

答案 1 :(得分:2)

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

如果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)

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

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

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