Я понимаю, что вы используете dlopen
, а не CFBundle
или NSBundle
. Тем не менее, руководство по программированию * Загрузка кода говорит об этом:
В приложениях Какао не следует использовать подпрограммы CFBundle
для загрузки и выгрузки исполняемого кода, поскольку CFBundle
изначально не поддерживает среду выполнения Objective C. NSBundle
правильно загружает символы Objective-C в систему времени выполнения, но нет способа выгрузить связки Какао после загрузки из-за ограничения времени выполнения.
и это:
Из-за ограничения в среде выполнения Objective C NSBundle
не может выгружать исполняемый код.
Это заставляет меня подозревать, что когда вы загружаете вашу библиотеку, она регистрируется в среде выполнения Objective C, и среда снова вызывает dlopen
в библиотеке (или как-то увеличивает счетчик ссылок библиотеки).
Я искал исходный код среды выполнения Objective C и нашел this :
// dylibs are not allowed to unload
// ...except those with image_info and nothing else (5359412)
if (result->mhdr->filetype == MH_DYLIB && _hasObjcContents(result)) {
dlopen(result->os.dl_info.dli_fname, RTLD_NOLOAD);
}
Так что да, среда выполнения Objective C вызывает dlopen
для вашей библиотеки специально, чтобы предотвратить ее выгрузку. Если вы обманываете и дважды звоните dlclose
, вы должны ожидать, что произойдут плохие вещи.