У меня есть метод проверки основных данных, который я написал, который не будет компилироваться.Я могу изменить метод так, чтобы он компилировался ... но тогда я получаю ошибки во время выполнения.Ниже приведены две версии метода (обратите внимание на пропущенный '*' во второй версии).Эта версия компилируется, но выдает ошибку времени выполнения "+ [NSCFNumber doubleValue]: нераспознанный селектор отправлен в класс 0x7fff70a448e8":
- (BOOL)validateInitialValue:(id *)value error:(NSError **)error {
if ( *value == nil ) {
return YES;
}
if ( [*value doubleValue] < 0.0 ) {
return NO;
}
return YES;
}
Эта версия выдает предупреждения и ошибки компилятора (см. Предупреждения и ошибки ниже):
- (BOOL)validateInitialValue:(id *)value error:(NSError **)error {
if ( value == nil ) {
return YES;
}
if ( [value doubleValue] < 0.0 ) {
return NO;
}
return YES;
}
ошибки и предупреждения компилятора:
warning: Semantic Issue: Receiver type 'id *' is not 'id' or interface pointer, consider casting it to 'id'
warning: Semantic Issue: Method '-doubleValue' not found (return type defaults to 'id')
error: Semantic Issue: Invalid operands to binary expression ('id' and 'double')
Я наконец понял, что проблема может заключаться в коде вызова:
- (void)setInitialValue:(NSNumber *)initialValue {
[self willChangeValueForKey:@"initialValue"];
[self validateValue:initialValue forKey:@"initialValue" error:nil];
[self setPrimitiveInitialValue:initialValue];
[self didChangeValueForKey:@"initialValue"];
}
Я изменил вызывающую сторону для использования '& 'before initialValue и использовал первую версию метода, и все работало.Таким образом, в новом коде вызова одна строка была изменена на следующее:
[self validateValue:&initialValue forKey:@"initialValue" error:nil];
Но действительно ли необходимо иметь '&' ??setPrimitiveInitialValue не использует '&'.Я чувствую, что мое понимание Objective-C еще недостаточно развито, и все вы, гуру, найдете этот тривиальный вопрос с очень прямым ответом.