Класс Objective-C, возвращаемый функцией alloc, путается с неправильным классом при инициализации

Мне казалось, что я понял базовые принципы Objective-C в том, что касается методов alloc и init ..., но, видимо, нет. Я свел проблему, с которой я столкнулся, к минимальный пример ниже. (В этом примере я помещаю весь исходный код в один файл, но проблема возникает точно так же, если источник разбит на несколько исходных файлов и файлов заголовков, как это обычно бывает).

Вот синопсис что делает код и что происходит, когда я его запускаю.

Я определяю два класса MyInteger и MyFloat, которые почти идентичны, за исключением того, что один имеет дело с типом int, а другой - с float. У обоих есть методы инициализатора, называемые initWithValue:, но с другим типом аргумента. Существует #define, чтобы контролировать, определен ли класс MyInteger или нет, причина в том, что это приводит к другому поведению программы, даже если класс никогда не используется.

main () использует только MyFloat. Первые две строки делают следующее: выделяет экземпляр MyFloat и инициализирует его значением 50.0. Затем он печатает значение. В зависимости от того, определен MyInteger или нет, я получаю два разных результата.

Без определения MyInteger, как я и ожидал:


[4138:903] float parameter value:50.000000
[4138:903] Value:50.000000
(next two output lines omitted)

С определением MyInteger, к моему большому удивлению:


[4192:903] float parameter value:0.000000
[4192:903] Value:0.000000
(next two output lines omitted)

Мне кажется, что компилятор обрабатывает вызов initWithValue: как если бы он принадлежит классу MyInteger. В следующих двух строках main () это проверяется приведением [MyFloat alloc] к типу MyFloat *. И это действительно генерирует вывод, как ожидалось, даже если MyInteger определен:


[4296:903] float parameter value:0.000000
[4296:903] Value:0.000000
[4296:903] float parameter value:50.000000
[4296:903] Value with cast:50.000000

Пожалуйста, объясните, что происходит! Я боролся с этим уже более 24 часов, даже до того, что открыл двери, чтобы дать немного тепла, чтобы мой компьютер мог остыть :-) Спасибо!

Еще одна странность заключается в том, что если я переместу определение MyInteger ниже определения MyFloat, значит все "хорошо" - работает, как я ожидал. История слишком часто доказывала, что я ошибался, и я не мог подозревать, что виноват компилятор. В любом случае, вот информация о компиляторе и проекте: Использование Xcode 4.0.2. Испытано со всеми тремя вариантами компилятора (GCC 4.2, LLVM GCC 4.2 и LLVM Compiler 2.0). Мне нужно сократить URL-адрес перед публикацией твита через API. Как мне делать этот? Поддерживается ли это Twitter API или мне нужно использовать какой-то другой ...

Есть ли способ получить сокращенный URL-адрес t.co из API? Мне нужно сократить URL-адрес перед публикацией твита через API. Как мне делать этот? Поддерживается ли это Twitter API или мне нужно использовать какой-то другой сокращение URL как bit.ly?

23
задан arcain 5 December 2012 в 23:54
поделиться