Передаваемый по значению аргумент в выражении сообщения не определен - PullRequest
0 голосов
/ 26 июня 2010

Я разрабатываю приложение для 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 и longitudeValue, вызывая obtainLatitude:longitude:, но я делаю что-то не так.

Как я могу исправить эту ошибку?

Ответы [ 2 ]

5 голосов
/ 26 июня 2010

Ответ Эльфреда работает, но передача по ссылке для не-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.

Как указывает Дейв, вам действительно не нужно определять свой собственный тип для этого. Используйте CLLocationCoordinate2D или CLLocation.

2 голосов
/ 26 июня 2010

Вы действительно передаете указатели по значению, поэтому, когда вы переназначаете их, это действует только внутри метода. Один из вариантов - сделать следующее:

- (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];
...