0

我正在开发一个 iPhone 应用程序,并在方法中收到该警告:

NSNumber *latitudeValue;
NSNumber *longitudeValue;

[self obtainLatitude:latitudeValue longitude:longitudeValue];

该方法声明如下:

- (void) obtainLatitude:(NSNumber *)latitudeValue longitude:(NSNumber *)longitudeValue {

    NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];

    latitudeValue = [f numberFromString:[latitude.text stringByReplacingOccurrencesOfString:@"," withString:@"."]];
    longitudeValue = [f numberFromString:[longitude.text stringByReplacingOccurrencesOfString:@"," withString:@"."]];

    [f release];
}

如您所见,我正在尝试计算latitudeValuelongitudeValue调用obtainLatitude:longitude:,但我做错了。

我该如何解决这个错误?

4

2 回答 2

5

Elfred 的回答有效,但非 NSError** 参数的传递引用非常少见。同样,坐标——通常是数值——通常存储在结构中的常规旧 C 类型中,因为相对而言,NSNumber 是相当多的开销(对于少数几个来说没什么大不了的,这将是如果您有几十个、几百个或几千个坐标,则会出现问题)。

就像是:

struct MyLocation {
  CGFloat latitude;
  CGFloat longitude;
};
typedef struct MyLocation MyLocation;

然后:

- (MyLocation) mapCoordinates {
    MyLocation parsedLocation;

    parsedLocation.latitude = ....;
    parsedLocation.longitude = ....;

    return parsedLocation;
}

在 iPhone/Cocoa 程序中,上述情况更为典型。

正如 Dave 指出的那样,您实际上不需要为此定义自己的类型。使用CLLocationCoordinate2D 或 CLLocation。

于 2010-06-26T17:12:07.320 回答
2

您确实是按值传递指针,因此当您重新分配它们时,这只会在您的方法中生效。一种替代方法是执行以下操作:

- (void) obtainLatitude:(NSNumber **)latitudeValue longitude:(NSNumber **)longitudeValue {

    NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
    [f setNumberStyle:NSNumberFormatterDecimalStyle];

    *latitudeValue = [f numberFromString:[latitude.text stringByReplacingOccurrencesOfString:@"," withString:@"."]];
    *longitudeValue = [f numberFromString:[longitude.text stringByReplacingOccurrencesOfString:@"," withString:@"."]];

    [f release];

}

那么您的电话将如下所示:

NSNumber *latitudeValue;
NSNumber *longitudeValue;

[self obtainLatitude:&latitudeValue longitude:&longitudeValue];
于 2010-06-26T17:00:27.690 回答