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_tsize);Параметры
sizeЧисло байтов для выделения
Возвращаемое значение
Указатель на блок памяти при наличии,
NULLиначе. -
Если подсчет ссылок опускается до нуля, выпускает ссылку на объект, освободив его сразу.
Объявление
C++
virtual void release() const;Обсуждение
Эта функция постепенно уменьшает подсчет ссылок получателя 1. Если подсчет ссылок опускается до нуля, объект сразу освобожден с помощью
free. -
Если подсчет ссылок опускается ниже указанного порога, выпускает ссылку на объект, освободив его сразу.
Объявление
C++
virtual void release( intfreeWhen) 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 и подклассами для отслеживания включения в наборы.
Если необходимо поддержать ссылку на объект вне контекста, в котором Вы получили его, необходимо всегда сразу сохранить его.
