Для чего нужны поля указателя на функцию в SCDynamicStoreContext?

SCDynamicStoreContext определяется так (версия 0):

typedef struct {
CFIndex        version;
void *         info;
const void *   (*retain)(const void *info);
void           (*release)(const void *info);
CFStringRef    (*copyDescription)(const void *info);
} SCDynamicStoreContext;

Различные примеры, которые я видел, как инициализировать SCDynamicStoreContext (в том числе один от Apple) все установи retain, release, а также copyDescription поля для NULL, но мне интересно, для чего эти поля.

Каковы последствия не прохождение retain а также release функция, когда, например, info объект является NSObject?

Что copyDescription функция используется для?

1

Решение

Время жизни SCDynamicStore объект, созданный, например, SCDynamicStoreCreate() является неопределенным. Он будет жить до тех пор, пока не будет полностью освобожден. Пока он живет, он может вызвать предоставленный обратный вызов. Когда это произойдет, он пройдет info указатель предоставляется в контексте. Если вы не предпримете шаги, чтобы убедиться, что этот указатель остается действительным в течение всего времени существования объекта динамического хранилища, то info указатель может стать недействительным. Ваш обратный вызов может вызвать сбой или неправильное поведение, если он получает доступ к info указатель после того, как он стал недействительным.

retain а также release функциональные указатели контекста позволяют каркасу дать вам возможность узнать, как долго info указатель должен оставаться в силе. Это, очевидно, должно быть в силе (или NULL) во время создания динамического хранилища. Кроме того, он должен оставаться в силе до тех пор, пока любые звонки на retain функция не была сбалансирована соответствующим вызовом release функция.

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

copyDescription Функция является средством улучшения вывода отладочной информации. Например, при определенных обстоятельствах платформа может написать сообщение журнала. Он попытается описать динамический объект хранилища, который столкнулся с обстоятельствами. Чтобы сделать это таким образом, который наиболее целесообразен для клиента, он может включать описание info из контекста. Если у него нет copyDescription функция, лучшее, что он может сделать, это записать значение указателя. Если это так, то он может написать любое описание, предоставленное этой функцией.

Не случайно сигнатуры трех указателей функций совпадают с CFRetain(), CFRelease(), а также CFCopyDescription(), Так что если info является базовым объектом или объектом Какао (так как NSObject бесплатный мост соединен с CFTypeRef), тогда вы можете предоставить эти функции в контексте, и все будет работать так, как вы ожидаете.

4

Другие решения


По вопросам рекламы [email protected]