मुझे एहसास है कि आप dlopen
का उपयोग कर रहे हैं, CFBundle
या NSBundle
नहीं।
कोको अनुप्रयोगों में, आप CFBundle
दिनचर्या उपयोग नहीं करना चाहिए लोड और निष्पादन योग्य कोड अनलोड करने के लिए, क्योंकि CFBundle
देशी रूप ऑब्जेक्टिव-सी क्रम का समर्थन नहीं करता: फिर भी, Code Loading Programming Topics मैनुअल इस कहते हैं। NSBundle
रनटाइम सिस्टम में ऑब्जेक्टिव-सी प्रतीकों को सही ढंग से लोड करता है, लेकिन रनटाइम सीमा के कारण लोड होने के बाद कोको बंडलों को उतारने का कोई तरीका नहीं है।
और इस:
ऑब्जेक्टिव-सी क्रम प्रणाली में एक सीमा की वजह से
, NSBundle
निष्पादन योग्य कोड उतारना नहीं कर सकते।
यह मैं संदेह है कि जब आप अपने पुस्तकालय लोड करते हैं, यह अपने आप में ऑब्जेक्टिव-सी क्रम के साथ पंजीकृत है, और क्रम फिर से dlopen
पुस्तकालय पर कॉल (या किसी भी तरह बढ़ जाती है लाइब्रेरी की संदर्भ गिनती)।
मैं ऑब्जेक्टिव-सी क्रम स्रोत कोड खोज की है और 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);
}
तो हाँ, ऑब्जेक्टिव-सी क्रम अपने पुस्तकालय पर dlopen
बुला रहा है विशेष रूप से यह उतार होने से रोकने के। यदि आप धोखा देते हैं और dlclose
दो बार कॉल करते हैं, तो आपको बुरी चीजें होने की उम्मीद करनी चाहिए।
स्रोत
2012-01-09 19:08:14
क्या आप सुनिश्चित हैं कि आपकी लाइब्रेरी छिपी हुई तरीके से दो बार 'dlopen'-ed नहीं है? या शायद एक बग-e.g. मेमोरी लीक- 'dlopen'-ed हैंडल के पास स्मृति को ओवरराइट कर रहा है? –
dlopen लाइब्रेरी हैंडल पर संदर्भ संख्या रखता है। यदि डलोपेन दो बार किया गया था, तो पुस्तकालय को उतारने के लिए इसे दो dlclose() की आवश्यकता होगी। यदि आप obj-c कोड शामिल करते हैं तो क्या गतिशील लाइब्रेरी आवश्यक है? जब आप अपना प्रोग्राम – Finslicer
चलाते हैं तो पहले डलोपेन किया जा सकता है हां, मुझे यकीन है कि यह दो बार नहीं खोला गया है। आप मुख्य रूप से dlopen के साथ एक सरल प्रोग्राम का प्रयास कर सकते हैं जिसके बाद गतिशील पुस्तकालय के साथ dlclose है जिसका उद्देश्य सी कोड है। – MacGeek