OSObject
OSObject является конкретным корневым классом Libkern и иерархии класса C++ Набора I/O.
OSObject определяет минимальную функциональность, требуемую Libkern и классов C++ Набора I/O: принудительный ассортимент к средству информации о типах во время выполнения, динамической парадигме выделения/инициализации и подсчету ссылок. В то время как расширения ядра свободны использовать свои собственные классы C++ внутренне, любое взаимодействие, которое они имеют с Libkern, или Набор I/O потребует классов, в конечном счете полученных из OSObject.
Информация о типах во время выполнения
OSObject получен из абстрактного корневого класса OSMetaClassBase, объявляющий (и определяет многие из), примитивы, на которых базируется средство информации о типах во время выполнения. Параллельная иерархия наследования объектов метакласса обеспечивает самоанализ во время выполнения, включая доступ к именам классов, наследованию и безопасному преобразованию типа. Посмотрите OSMetaClass для получения дополнительной информации.
Динамическое Выделение/Инициализация
Резидентное ядром время выполнения C++ не поддерживает исключения, таким образом, классы Libkern не могут использовать типичных конструкторов объекта C++ и деструкторы, использующие исключения для создания отчетов об ошибках. Для поддержки обработки ошибок во время создания экземпляра, тогда, OSObject разделяет объектное выделение от инициализации. Можно создать новый OSObject-полученный экземпляр с new
оператор, но это делает не что иное как выделяет память и инициализирует подсчет ссылок к 1. После этого необходимо вызвать определяемую функцию инициализации и проверить bool
возвращаемое значение. Если инициализация перестала работать, необходимо сразу вызвать release
на экземпляре и дескрипторе отказ любым способом является надлежащим. Много Libkern и классы Набора I/O определяют статические функции создания экземпляра (начинающийся со слова «с») для создания конструкции процессом с одним шагом для клиентов.
Подсчет ссылок
OSObject предоставляет услуги подсчета ссылок с помощью retain
, release()
, release(int freeWhen)
и free
функции. Открытый интерфейс к подсчету ссылок retain
, и release
; release(int freeWhen)
предоставлен для объектов, имеющих внутренний, сохраняют циклы.
В целом подкласс, как ожидают, только переопределит free
. Это может также принять решение переопределить release(int freeWhen)
если объект имеет проспект, сохраняют количество, как отмечено выше.
Используйте ограничения
За очень немногими исключениями в Наборе I/O все находящиеся в Libkern классы C++, функции и макросы небезопасны использовать в основном контексте прерывания. Консультируйтесь с документацией Набора I/O, связанной с основными прерываниями для получения дополнительной информации.
Защита параллелизма
Основные характеристики OSObject ориентированы на многопотоковое исполнение. Если экземпляры совместно используются потоками, большинство подклассов Libkern не и требует блокировки или другой защиты. Объекты драйвера Набора I/O или разработаны для использования в ориентированных на многопотоковое исполнение контекстах или разработаны, чтобы по сути быть ориентированными на многопотоковое исполнение. Всегда проверяйте отдельную документацию класса для наблюдения, какие шаги необходимы для параллельного использования экземпляров.
Наследование
Не применимый
Соответствует
Не применимый
Оператор импорта
Не применимый
Objective C
@import Kernel;
Доступность
Доступный в OS X v10.0 и позже.
-
Освобождает/выпускает ресурсы, сохраненные объектом.
Объявление
C++
virtual void free();
Обсуждение
Классы, полученные из OSObject, должны переопределить эту функцию, чтобы освободить или высвободить все динамические средства, сохраненные экземпляром, затем вызвать реализацию суперкласса.
Предостережение:
Вы не можете предположить завершение инициализации прежде
free
вызывается, так быть очень тщательным в Вашей реализации.Реализация OSOBJECT выполняет C++
delete
из экземпляра, так быть уверенным, что Вы вызываете реализацию суперкласса в последний раз в Вашей реализации.free
не должен перестать работать; все средства должны быть освобождены или высвобождены на завершении.
-
Возвращает подсчет ссылок объекта.
Объявление
C++
virtual int getRetainCount() const;
Возвращаемое значение
Подсчет ссылок объекта.
-
Инициализирует недавно выделенный объект.
Объявление
C++
virtual bool init();
Возвращаемое значение
true
на успехе,false
при отказе.Обсуждение
Классы, полученные из OSObject, должны переопределить основной init метод своего родителя. В целом большая часть вызова реализаций
::init()
прежде, чем сделать локальную инициализацию. Если тогда возвращаются сбои вызова суперклассаfalse
сразу. Если подкласс встречается с отказом тогда, он должен возвратитьсяfalse
. -
Освобождает память самого объекта.
Объявление
C++
static void operator delete( void *
mem
, size_tsize
);Параметры
mem
Указатель на память объекта.
size
Размер блока объекта памяти.
Обсуждение
Никогда не используйте
delete
на объектах, полученных из OSObject; использоватьrelease
вместо этого. -
Выделяет память для экземпляра класса.
Объявление
C++
static void * operator new( size_t
size
);Параметры
size
Число байтов для выделения
Возвращаемое значение
Указатель на блок памяти при наличии,
NULL
иначе. -
Если подсчет ссылок опускается до нуля, выпускает ссылку на объект, освободив его сразу.
Объявление
C++
virtual void release() const;
Обсуждение
Эта функция постепенно уменьшает подсчет ссылок получателя 1. Если подсчет ссылок опускается до нуля, объект сразу освобожден с помощью
free
. -
Если подсчет ссылок опускается ниже указанного порога, выпускает ссылку на объект, освободив его сразу.
Объявление
C++
virtual void release( int
freeWhen
) const;Параметры
freeWhen
Если постепенное уменьшение подсчета ссылок делает его> =
freeWhen
, объект сразу освобожден.Обсуждение
Если получатель имеет
freeWhen
или меньше ссылок после его подсчета ссылок постепенно уменьшается, это сразу освобождено.Эта версия
release
может использоваться для повреждения бесспорный, сохраняют циклы в графах объектов. В целом, однако, этого нужно избежать. -
Сохраняет ссылку на объект.
Объявление
C++
virtual void retain() const;
Обсуждение
Эта функция постепенно увеличивает подсчет ссылок получателя 1. Если необходимо поддержать ссылку на объект вне контекста, в котором Вы получили его, необходимо всегда сразу сохранить его.
-
Переопределенный подклассами для архивации получателя в предоставленный объект OSSerialize.
Объявление
C++
virtual bool serialize( OSSerialize *
serializer
) const;Параметры
serializer
Объект OSSerialize.
Возвращаемое значение
true
если сериализация успешно выполняется,false
если нет.Обсуждение
Реализация OSOBJECT пишет строку, указывающую, что класс объекта, получающего вызов функции, не является сериализуемым. Подклассы, которые могут обоснованно закодировать себя в XML списка Свойства стиля набора I/O, могут переопределить эту функцию, чтобы сделать так. См. OSSerialize для получения дополнительной информации.
-
Если подсчет ссылок опускается до нуля, выпускает маркированную ссылку на объект, освободив его сразу.
Объявление
C++
virtual void taggedRelease( const void *tag = 0) const;
Параметры
tag
Используемый для отслеживания ссылок набора.
Обсуждение
Расширения ядра не должны использовать эту функцию. Это для использования OSCollection и подклассами для отслеживания включения в наборы.
-
taggedRelease (константа, недействительная *, интервал константы) - taggedRelease (константа, недействительная *, интервал константы)
Если подсчет ссылок опускается ниже указанного порога, выпускает маркированную ссылку на объект, освободив его сразу.
Объявление
C++
virtual void taggedRelease( const void *
tag
, const intfreeWhen
) const;Параметры
tag
Используемый для отслеживания ссылок набора.
freeWhen
Если постепенное уменьшение подсчета ссылок делает его> =
freeWhen
, объект сразу освобожден.Обсуждение
Расширения ядра не должны использовать эту функцию. Это для использования OSCollection и подклассами для отслеживания включения в наборы.
Если получатель имеет
freeWhen
или меньше ссылок после его подсчета ссылок постепенно уменьшается, это сразу освобождено.Эта версия
release
может использоваться для повреждения бесспорный, сохраняют циклы в графах объектов. В целом, однако, этого нужно избежать. -
Сохраняет ссылку на объект с дополнительным тегом, используемым для отслеживания ссылки.
Объявление
C++
virtual void taggedRetain( const void *tag = 0) const;
Параметры
tag
Используемый для отслеживания ссылок набора.
Обсуждение
Расширения ядра не должны использовать эту функцию. Это для использования OSCollection и подклассами для отслеживания включения в наборы.
Если необходимо поддержать ссылку на объект вне контекста, в котором Вы получили его, необходимо всегда сразу сохранить его.