消息表达式中的值传递参数未定义

时间:2010-06-26 16:56:07

标签: iphone objective-c argument-passing

我正在开发一个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];
}

正如您所看到的,我正在尝试计算调用latitudeValue的{​​{1}}和longitudeValue,但我做错了。

如何修复该错误?

2 个答案:

答案 0 :(得分:5)

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

类似的东西:

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

然后:

- (MyLocation) mapCoordinates {
    MyLocation parsedLocation;

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

    return parsedLocation;
}

类似上述内容在iPhone / Cocoa程序中更为典型。

正如Dave指出的那样,你真的不需要为此定义自己的类型。使用CLLocationCoordinate2D or CLLocation.

答案 1 :(得分: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];