我正在开发一个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
,但我做错了。
如何修复该错误?
答案 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];