Высокоуровневая 64-разрядная поддержка API

При начале в OS X v10.5, большая часть OS X APIs доступен 64-разрядным приложениям. Продвижение, Apple планирует сделать новый APIs 64 битами совместимый, если не указано иное. Однако не весь существующий 32-разрядный APIs поддерживается в 64-разрядных приложениях.

Эта глава включает краткий обзор этих изменений API и ограничений и включает указатели на другую документацию, предоставляющую больше подробную страховую защиту определенным технологическим областям.

Высокоуровневые изменения API сразу

Высокоуровневые изменения API, связанные с 64-разрядной поддержкой обычно, попадают в одну из следующих категорий:

Они описаны подробно в следующих разделах.

Изменения в типах данных

Старшее значащее изменение к использованию типа и типам данных. Много специфичных для Apple типов данных определяются по-другому в 64-разрядном мире. В некоторых случаях 32-разрядные значения были заменены 64-разрядными значениями для будущего расширения. В других случаях типы данных, становящиеся 64-разрядными в 64-разрядной среде, были заменены типами данных, остающимися 32-разрядными — для сохранения совместимости формата файла, например.

Результат этих изменений состоит в том, что много типов производных данных имеют различные размеры (и таким образом, различные объявления) в зависимости от того, используются ли они в 32-разрядном или 64-разрядном контексте.

Для поддержки 64-разрядных приложений OS X изменил свои типы данных и использование типа в этих широких областях:

  • Размер (и выравнивание) базовых типов данных (например, long)

  • Выбор базовых базовых типов данных, используемых в типах производных данных (такой как SInt32)

  • Базовые типы данных, используемые в полях структуры (таких как те в ScriptLanguageRecord) и параметры функциям и методам

  • Замена API и осуждение

Эти типы данных идут многими именами в различных технологических областях, но с точки зрения их базового представления, затронутые типы данных являются одним из показанных в Изменениях Типа данных. Кроме того, много функций, использующих эти базовые типы данных непосредственно, были изменены для использования типов производных данных так, чтобы их базовый тип мог варьироваться между 32-разрядными и 64-разрядными средами.

Существует четыре общих ситуации, в которых типы данных отличаются по 64-разрядному миру:

  • 32-разрядный int типы данных, которые должны содержать указатели. Поскольку указатель составляет 64 бита в длине, этом использовании int типы данных были изменены на long типы данных.

  • 32-разрядный int типы данных, которые могли обоснованно содержать больший набор данных в 64-разрядном приложении. Поскольку жизнеспособное число объектов в наборе данных может быть намного больше в 64-разрядном приложении, они были изменены на long типы данных, когда это целесообразно для такого большого количества существовать. Это определение варьируется на основе API API.

  • 32-разрядный long типы данных, представляющие часть структуры данных, размер которой и структура не должны изменяться. Поскольку long является 64-разрядным на 64-разрядной архитектуре, они были изменены на int сохранить совместимость.

  • 32-разрядный long типы данных, представляющие количества, константы или флаги, которые не могут практически превысить пределы 32-разрядного целого числа (например, идентификатор окна). Поскольку long является 64-разрядным на 64-разрядной архитектуре, многих таких случаях long были изменены на int где это не целесообразно для большего значения когда-либо происходить. Это определение варьируется между APIs.

Например, тип данных URefCon определяется в 32-разрядных приложениях как:

typedef unsigned long URefCon;

и в 64-разрядных приложениях как:

typedef void *URefCon;

Эти изменения, опрыснутые всюду по всем функциям и типам данных в почти каждой технологической области, представляют подавляющее большинство изменений, с которыми Вы встретитесь.

Новый/Заменять/Осуждать APIs

В дополнение к изменениям API, следующим из изменений в типах данных, используемых в параметрах и возвращаемых значениях, другие технологические области изменяются значительно в 64-разрядном мире. Большинство этих изменений является определенным для языка C APIs.

В определенных технологических областях (Углерод особенно), несколько APIs были осуждены для 32-разрядного использования, начинающегося в OS X v10.5. Большая часть этого APIs не доступна в 64-разрядных приложениях. Например, любое использование функций FSSpec не стали, таким образом, необходимо использовать FSRef- основанные функции. Это изменение влияет на многие другие связанные технологические области. В различном APIs существует также много других небольших, изолированных изменений. Можно узнать больше об этих изменениях с помощью Научного сотрудника в XCode.

В дополнение к этим удалениям функционального уровня немного всего Углерода и технологий QuickTime не будут поддерживаться в 64-разрядных приложениях.

Технологические изменения области сразу

Изменения в технологических областях попадают в эти широкие категории: Углерод, Какао/Objective C, QuickTime и другой APIs C. Следующие разделы объясняют эти изменения более подробно.

Какао и приложение Objective C APIs

Большая часть APIs Objective C не изменится существенно для 64-разрядного, потому что большинство фактических типов данных достаточно абстрагировано, что фактическое представление не имеет значения для приложения. Например, a CFNumber или NSNumber объект мог иметь произвольное представление под капотом. Однако при извлечении этой информации в стандарт C типы необходимо быть осторожны относительно размеров тех типов в 64-разрядной среде.

Существуют исключения, как бы то ни было. Много typedef объявления в AppKit и Основе изменяются для 64-разрядного. В частности, типы данных, базовые типы которых были первоначально определены как enum теперь имейте базовые типы, указывающие желаемое целочисленное представление, такой как int или long.

Кроме того, типы NSInteger и NSUInteger были добавлены. Они используются для замены использования int и unsigned int во многих объявлениях функции. Поскольку эти типы имеют тот же базовый базовый тип в 32-разрядной среде, разработчики не должны должны быть изменять свой код для соответствия типов в 32-разрядных приложениях. В 64-разрядных приложениях, однако, базовых типах для NSInteger и NSUInteger long и unsigned long, соответственно. Таким образом в 64-разрядных приложениях, необходимо будет заменить это использование int и unsigned int с NSInteger и NSUInteger.

Наконец, некоторые объявления метода Objective C могут измениться, особенно те, которые используют базовые типы данных C int и long или типы произошли от них. Этот APIs будет иметь те же проблемы как стандарт C APIs, хотя до меньшего градуса.

Для более подробной информации посмотрите 64-разрядное Руководство по Переходу для Какао.

Ядро и Набор I/O APIs

С v10.8 больше не поддерживаются 32-разрядные расширения ядра. Драйверы и другие расширения ядра для более ранних версий OS X должны обеспечить 64-разрядные исполнимые программы для OS X v10.6 и позже.

Кроме того, Набор I/O был расширен несколько в OS X v10.5 для включения поддержки 64-разрядных приложений, работающих на 32-разрядном ядре. Эти изменения находятся прежде всего в форме дополнительных методов в IOMemoryDescriptor класс.

Все поддерживали интерфейсы ядра BSD (KPIs), и системные вызовы должны быть 64-разрядным чистым началом в OS X v10.4. Программное обеспечение, использующее эти вызовы от пространства пользователя, не должно требовать никаких модификаций, определенных для использования этих интерфейсов, предполагающих, что они используют указанные типы для параметров и возвращаемых значений.

QuickTime

Классы Набора QuickTime будут основным интерфейсом в QuickTime. Методы, берущие или возвращающие собственный QuickTime C идентификаторы (в частности Фильм, MovieController, Дорожка и Носители) не поддерживаются в 64-разрядных приложениях.

Несмотря на то, что QuickTime C APIs не осуждается для 32-разрядного использования, Вы не можете непосредственно использовать их в 64-разрядных приложениях.

Музыкальная Архитектура QuickTime (QTMA) API не доступна в 64-разрядных приложениях. Как альтернатива, необходимо использовать Core Audio API.

Для получения дополнительной информации о QuickTime поддержка API в 64-разрядных приложениях посмотрите 64-разрядное Руководство для Разработчиков Углерода.

Углерод

Некоторые менеджеры по Углероду и технологии значительно сокращены или недоступны в 64-разрядных приложениях. Для получения дальнейшей информации посмотрите 64-разрядное Руководство для Разработчиков Углерода.

Другое приложение C APIs

В целом большинство изменений API C в употреблении int и long в прототипах функции. Точно так же много типов данных на основе int или long изменили размеры.

В Базовой Графике много ранее возвратившихся функций int теперь возвратитесь bool более точно отразить информацию возвратилось. Кроме того, много Базовых Графических функций теперь используют CGFloat вместо float. Размер a CGFloat больше в 64-разрядных приложениях, чем в 32-разрядных приложениях для обеспечения большей точности и диапазона.

Наконец, в Базовой Основе и других технологических областях, многом использовании int и long были заменены псевдонимами к этим типам в форме именованных типов такой как CFIndex. Некоторые из них являются новыми типами, создаваемыми, потому что базовый тип изменяется от int к long (или наоборот) между 32-разрядными и 64-разрядными объявлениями. В других случаях они существуют ранее типы, просто выполняющие лучшую работу при объяснении использования данного параметра (например, с помощью a CFIndex содержать индексное значение).

Для более подробной информации посмотрите 64-разрядное Руководство для Разработчиков Углерода.