-sizeWithFont работает по-разному на устройстве - PullRequest
3 голосов
/ 13 апреля 2010

Так что я, кажется, сталкиваюсь с некоторым странным поведением при использовании -sizeWithFont семейства вызовов методов в зависимости от того, вызываю ли я его на iPhone Simulator или на реальном устройстве.

Достаточно просто, когда получатель вызова метода -sizeWithFont:constrainedToSize:lineBreakMode: равен nil, результирующий CGSize, переданный обратно в симулятор, равен {0, 0}. Однако на устройстве возвращаемый результат - это то же значение CGSize, которое я указываю в вызове метода в качестве параметра constrainedToSize:. См. Следующие операторы журнала:

Simulator:

someString: (null)
someStringSize: {0, 0}

Прибор:

someString: (null)
someStringSize: {185, 3.40282e+38}

Поведение на симуляторе - то, чего я ожидал. Не то чтобы эту проблему трудно обойти, но 1) я немного запутался, почему это семейство функций будет вести себя по-разному на симуляторе и реальном устройстве, и 2) почему вызов метода на nil получателе возвращает конкретный, детерминированный результат?

Спасибо за любые подсказки или идеи, которые вы, ребята, можете предоставить!

РЕДАКТИРОВАТЬ : Полагаю, я должен упомянуть, что я строю против SDK 3.1.

1 Ответ

5 голосов
/ 14 апреля 2010

Документация Apple по Отправка сообщений на ноль вроде объясняет это:

Значение, возвращаемое из сообщения в ноль, также может быть действительным:

  • Если метод возвращает объект, то сообщение, отправленное на ноль, возвращает 0 (ноль) ...
  • Если метод возвращает любой тип указателя, любой целочисленный скаляр с размером, меньшим или равным sizeof (void *), с плавающей запятой, double, long double или long long, то сообщение, отправленное на nil, возвращает 0 .
  • Если метод возвращает структуру, определенную в Руководстве по вызову функции ABI для Mac OS X , которая должна быть возвращена в регистрах, то сообщение, отправленное на ноль, возвращает 0.0 для каждого поля в структуре данных. Другие типы данных структуры не будут заполнены нулями.
  • Если метод возвращает что-либо кроме вышеупомянутых типов значений, возвращаемое значение сообщения, отправленного на nil, не определено.

Хотя в этом документе конкретно не говорится об iPhone (и он был написан до выпуска iPhone SDK), обратите внимание на третий и четвертый пункты: если метод возвращает структуру (например, CGSize), поведение зависит от платформы. Только значения, возвращаемые в регистрах ЦП, заполняются нулями. Я не эксперт по архитектуре ARM iPhone, но вполне вероятно, что на iPhone возвращаемое значение sizeWithFont: не возвращается в регистрах, в отличие от i386. В этом случае возвращаемая структура будет заполнена нулями при работе на симуляторе, а значение будет неопределенным при работе на iPhone.

...