Высокоуровневая 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-разрядное Руководство для Разработчиков Углерода.