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
функция используется для?
Время жизни SCDynamicStore
объект, созданный, например, SCDynamicStoreCreate()
является неопределенным. Он будет жить до тех пор, пока не будет полностью освобожден. Пока он живет, он может вызвать предоставленный обратный вызов. Когда это произойдет, он пройдет info
указатель предоставляется в контексте. Если вы не предпримете шаги, чтобы убедиться, что этот указатель остается действительным в течение всего времени существования объекта динамического хранилища, то info
указатель может стать недействительным. Ваш обратный вызов может вызвать сбой или неправильное поведение, если он получает доступ к info
указатель после того, как он стал недействительным.
retain
а также release
функциональные указатели контекста позволяют каркасу дать вам возможность узнать, как долго info
указатель должен оставаться в силе. Это, очевидно, должно быть в силе (или NULL
) во время создания динамического хранилища. Кроме того, он должен оставаться в силе до тех пор, пока любые звонки на retain
функция не была сбалансирована соответствующим вызовом release
функция.
Если вы не предоставляете функции сохранения и разблокировки, то либо info
Указатель должен оставаться действительным вечно или, по крайней мере, так долго, как это делает объект динамического хранилища, и вы несете ответственность за это. Это может быть несколько сложно, потому что вы не всегда знаете, какие другие API сохранят объект динамического хранилища. Он определенно будет поддерживаться, пока его источник цикла выполнения запланирован на цикл выполнения, хотя удаление источника из всех циклов выполнения не обязательно гарантирует, что он будет полностью освобожден в этот момент.
copyDescription
Функция является средством улучшения вывода отладочной информации. Например, при определенных обстоятельствах платформа может написать сообщение журнала. Он попытается описать динамический объект хранилища, который столкнулся с обстоятельствами. Чтобы сделать это таким образом, который наиболее целесообразен для клиента, он может включать описание info
из контекста. Если у него нет copyDescription
функция, лучшее, что он может сделать, это записать значение указателя. Если это так, то он может написать любое описание, предоставленное этой функцией.
Не случайно сигнатуры трех указателей функций совпадают с CFRetain()
, CFRelease()
, а также CFCopyDescription()
, Так что если info
является базовым объектом или объектом Какао (так как NSObject
бесплатный мост соединен с CFTypeRef
), тогда вы можете предоставить эти функции в контексте, и все будет работать так, как вы ожидаете.