Результаты для executeSelector: отличаются от стандартного точечного обозначения вызова? - PullRequest
1 голос
/ 22 июля 2009

Я был очень озадачен некоторыми неожиданными ошибками компиляции в моем коде в последнее время. Я выполнил поиск и устранение неисправностей, и у меня получился тестовый код:

1 float performSelectorResult, messageResult;
2 SEL selector = @selector(smallContentCellMargin);
3
4 NSLog (@"selector %s result %f", selector,  [defaults performSelector:selector]);
5 NSLog (@"message result is %f", defaults.smallContentCellMargin);
6
7 performSelectorResult = [defaults performSelector:selector];
8 messageResult = defaults.smallContentCellMargin;

Если я запускаю код как есть, я получаю ошибку компиляции в строке 7: «несовместимые типы в присваивании». Тем не менее, если я закомментирую строку 7, код будет собран и запущен; результаты в NSLog:

2009-07-21 18:31:44.823 ICE[24347:20b] selector smallContentCellMargin result 0.000000
2009-07-21 18:31:44.830 ICE[24347:20b] message result is 7.000000

Я использовал очень похожий код для получения UIFont, но никогда не использовал float. Есть что-то, чего я не знаю, или это ошибка в Objective-C? Я очень смущен.

1 Ответ

3 голосов
/ 22 июля 2009

Во-первых, это вы рассматриваете селектор как строку при входе в систему с NSLog. Не делайте этого - SEL не является строкой. Используйте формат% @ и NSStringFromSelector (aSelector).

Для рассматриваемой проблемы -performSelector: определено для работы с любым селектором, который имеет тип возвращаемого объекта. Из-за ABI вы можете избежать использования этого для типов возвращаемых int вплоть до размера указателя (в зависимости от деталей реализации во время выполнения), но вы, как вы заметили, обычно не можете использовать его для возвращаемых значений с плавающей точкой.

Для необъектных возвращаемых значений вы должны использовать NSInvocation или -valueForKey :. В последнем случае вы получите поплавок, помеченный как NSNumber.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...