Я пытался использовать id
для создания утки, набирающей текст в target-c. Концепция выглядит хорошо в теории, но не на практике. Я не смог использовать какие-либо параметры в моих методах. Методы были вызваны, но параметры были неправильными. Я получал BAD_ACESS для объектов и случайные значения для примитивов. Я привел простой пример ниже.
Вопрос:
Кто-нибудь знает, почему параметры методов неверны?
Что происходит под капотом объектива-с?
Примечание: меня интересуют детали. Я знаю, как сделать приведенный ниже пример.
Пример:
Я создал простой класс Test
, который передается другому классу с помощью свойства id test
.
@implementation Test
- (void) aSampleMethodWithFloat:(float) f andInt: (int) i {
NSLog(@"Parameters: %f, %i\n", f, i);
}
@end
Затем в классе выполняется следующий цикл:
for (int i=0; i < 10; ++i) {
float f=i*0.1f;
[tst aSampleMethodWithFloat:f andInt:i]; // warning no method found.
}
Вот вывод, который я получаю. Как видите, метод был вызван, но параметры были неверными.
Parameters: 0.000000, 0
Parameters: -0.000000, 1069128089
Parameters: -0.000000, 1070176665
Parameters: 2.000000, 1070805811
Parameters: -0.000000, 1071225241
Parameters: 0.000000, 1071644672
Parameters: 2.000000, 1071854387
Parameters: 36893488147419103232.000000, 1072064102
Parameters: -0.000000, 1072273817
Parameters: -36893488147419103232.000000, 1072483532
Обновление:
Я случайно обнаружил, что когда я добавляю объявление aSampleMethodWith...
в класс с циклом for
, предупреждение исчезает, и метод класса Test вызывается правильно.
Обновление 2:
Как указывает JeremyP, прямой причиной проблемы является то, что поплавки рассматриваются как двойные. Но кто-нибудь знает почему? (следуя принципу 5 почему :)).
Согласно @eman, вызов переводится в простой вызов функции C и директиву компилятора, чтобы получить SEL
. Таким образом, @selector запутывается. Но почему? Компилятор имеет всю необходимую информацию о типе в первом вызове метода. Кто-нибудь знает хороший источник информации о внутренностях Objective C, я искал Язык программирования Objective C, но я не нашел ответ.