2010-01-19 4 views
6

मैक ओएस एक्स पर ऑब्जेक्टिव-सी 2 का उपयोग कर, प्लगइन बंडलों तीन कचरा संग्रहण सेटिंग्स में से एक के साथ संकलित किया जा सकता:कोको प्लगइन बंडल कचरा संग्रह सेटिंग्स प्रोग्रामेटिक रूप से निर्धारित करने के लिए कैसे?

  1. समर्थित नहीं
  2. समर्थित (-fobjc-gc)
  3. आवश्यक (-fobjc-gc-only)

यह निर्धारित करने के लिए कि इनमें से किन तीन सेटिंग्स का उपयोग किया गया था, एक प्रोग्राम किए गए प्लगइन बंडल को प्रोग्रामेटिक रूप से कैसे क्वेरी कर सकता है?

उत्तर

3

diciu से उत्तर के बाद, आप Mach-O API का उपयोग कर सकते हैं। आपको बाइनरी फ़ाइल में निहित सेगमेंट को पार्स करना होगा और __OBJC एक की खोज करना होगा; segment_command संरचना सेगमेंट के झंडे तक पहुंच की अनुमति देता है।

आप ClassDump project पर भी एक नज़र डाल सकते हैं। इसमें एक बहुत अच्छा मैक-ओ पार्सर है।

4

यह __OBJC सेगमेंट का हिस्सा है लेकिन मुझे किसी भी एपीआई के बारे में पता नहीं है जो इसे उजागर करता है।

कचरा एकत्र:

cristi:tmp diciu$ otool -v -o ./a.out 
./a.out: 
Contents of (__DATA,__objc_classrefs) section 
00000001000010b0 0x0 
Contents of (__DATA,__objc_imageinfo) section 
    version 0 
    flags 0x6 OBJC_IMAGE_SUPPORTS_GC 

गैर कचरा एकत्र:

cristi:tmp diciu$ otool -v -o ./a.out 
./a.out: 
Contents of (__DATA,__objc_classrefs) section 
00000001000010b0 0x0 
Contents of (__DATA,__objc_imageinfo) section 
    version 0 
    flags 0x0 

क्रम करता है इस का उपयोग करते हुए निजी कार्यों: see gc_enforcer and it's use of * _objcInfoRequiresGC*

1

यह शायद सबसे आसान बस कोशिश करते हैं और का उपयोग कर बंडल लोड करने के लिए NSBundle के -loadAndReturnError: विधि। यदि बंडल इस तथ्य के कारण लोड नहीं होगा कि इसकी जीसी सेटिंग्स आपके ऐप के उन लोगों के लिए अलग हैं, तो आपको NSExecutableRuntimeMismatchError मिल जाएगा।

संबंधित मुद्दे