ARC फ़ाइल -fno-objc- आर्क को चिह्नित करने के बावजूद संरचना या संघों में ऑब्जेक्टिव-सी ऑब्जेक्ट्स को मना करता है


85

ARC ने फ़ाइल -fno-objc- आर्क को चिह्नित करने के बावजूद स्ट्रक्चर या यूनियनों में ऑब्जेक्टिव-सी ऑब्जेक्ट्स को मना किया है? ऐसा क्यों है?

मेरी यह धारणा थी कि यदि आप इसे -fno-objc-arc चिह्नित करते हैं तो आपके पास यह प्रतिबंध नहीं है।

जवाबों:


170

यदि आपको यह संदेश मिला है तो __unsafe_unretain का प्रयास करें। यह केवल सुरक्षित है, यदि संरचना में ऑब्जेक्ट अप्राप्त हैं। उदाहरण: यदि आप ARC के साथ OpenFeint का उपयोग करते हैं तो क्लास OFBragDelegateStrings एक संरचना में यह त्रुटि कहता है।

typedef struct OFBragDelegateStrings
{
     NSString* prepopulatedText;
     NSString* originalMessage;
} OFBragDelegateStrings;

सेवा

typedef struct OFBragDelegateStrings
{
     __unsafe_unretained NSString* prepopulatedText;
     __unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;

4
यह भी समस्याएं पैदा कर रहा है जब मैं स्ट्रिंग आवंटित करता हूं तो यह दिखाता है कि असाइन किए गए ऑब्जेक्ट को असुरक्षित_सुनिश्चित चर ऑब्जेक्ट को असाइन करने के बाद असाइनमेंट जारी किया जाएगा। और जब मैं इसका उपयोग करता हूं तो दुर्घटनाग्रस्त हो जाता है
दीपक सिंह नेगी

8
यह सभी समस्याओं को हल नहीं करता है, वस्तु को सामान्य रूप से तुरंत जारी किया जाएगा और इस प्रकार अनुपलब्ध है।
डिजिट

हां - यह वास्तव में काम नहीं करता है ... समाधान किसी भी तरह से एआरसी को एक व्युत्पन्न स्रोत फ़ाइल के लिए बंद करना है, जिसे मैं अभी तक पता नहीं लगा सका
हूं

1
आप निर्माण चरण में फ़ाइल के लिए -fno-objc-arc ध्वज जोड़कर करते हैं।
अबिज़र्न

क्या होगा यदि संरचना क्षेत्र केवल एक "गूंगा संदर्भ" है, और वस्तु को वास्तव में कहीं और रखा जा रहा है (स्वामित्व) (कहते हैं, अंदर NSArray)? उस मामले में, इसे तुरंत निस्तारित नहीं किया जाएगा, लेकिन मुझे आश्चर्य है कि कंपाइलर क्या कहेंगे (अभी इसका परीक्षण नहीं कर सकते हैं) ...
निकोलस मियारी

30

एक संरचना का उपयोग करने के बजाय , आप इसके बजाय डेटा का प्रबंधन करने के लिए एक उद्देश्य-सी वर्ग बना सकते हैं ।


कैसे? नमूना कहाँ है?

तो छोटे उपयोग के मामलों के लिए संरचना क्यों नहीं कर सकते?
देवांशु सैनी

13

ऐसा इसलिए है क्योंकि आर्क, वस्तुओं या यूनियनों में वस्तुओं को ट्रैक नहीं कर सकता (क्योंकि वे उस बिंदु सी बिंदु पर हैं)।

भले ही आपने फ़ाइल / वर्ग को -fno-objc-arcआपके साथ प्रश्न के रूप में चिह्नित किया हो, फिर भी आप इसे पैरामीटर के रूप में चाप द्वारा नियंत्रित एक ऑब्जेक्ट पास कर सकते हैं, जिसके परिणामस्वरूप मेमोरी लीक होने की संभावना होगी।


लेकिन फिर मैं अपनी परियोजनाओं में चाप और गैर-चाप फ़ाइलों का उपयोग करने में कैसे सक्षम हूं। उदाहरण के लिए मैं गैर-चाप के रूप में शेयरकिट का उपयोग करता हूं और प्रकाशित करने के लिए उदाहरणों का उपयोग करने में सक्षम हूं। मैं जिन फाइलों का उपयोग कर रहा हूं, वे आर्क फाइलें हैं।
Zsolt

आप -fno-objc-arcकिसी प्रोजेक्ट के भीतर ARC और नॉन ARC फ़ाइलों को मिलाने के लिए उपयोग कर सकते हैं , लेकिन अगर आप सादे C संरचनाओं जैसे स्ट्रक्चर या यूनियन का उपयोग कर रहे हैं तो आप ARC का उपयोग बिल्कुल भी नहीं कर सकते।
voidStern

धन्यवाद voidStern .. "लेकिन अगर आप सादे सी संरचनाओं जैसे संरचना या संघ का उपयोग कर रहे हैं तो आप एआरसी का उपयोग बिल्कुल भी नहीं कर सकते।" - मुझे नहीं लगता कि यह सच है। मैं अपनी फाइलों के लिए एआरसी का उपयोग कर रहा हूं। और लिबरारू फाइलों के लिए गैर-आर्क। जिस तरह से मैं अपनी मूल समस्या के आसपास गया, वह था सी फाइल में अलग-अलग मानों को पास करना और वहाँ संरचना बनाना। मुझे लगता है कि कुंजी चाप से गैर-चाप से चाप तक है।
Zsolt

1
सब कुछ थोड़ा अतिरंजित हो सकता है। संक्षेप में, आप ऑब्जेक्ट को स्ट्रक्चर और यूनियनों में नहीं डाल सकते हैं, जो एआरसी को भ्रमित करेगा। संरचना और / या यूनियनों के साथ एक सादे सी लाइब्रेरी का उपयोग करना (आमतौर पर) संभव होना चाहिए।
voidStern

6

ऐसा लगता है कि यह अब त्रुटियों के बिना काम करता है, शायद इस बदलाव के बाद ।

यानी, आप सी-स्ट्रक्चर में ऑब्जेक्टिव-सी ऑब्जेक्ट में सामान्य (मजबूत) पॉइंटर्स लगा सकते हैं। इसका प्रबंधन ARC उदा द्वारा किया जाता है, यह तब अप्राप्त होता है जब संरचना नष्ट हो जाती है। इसके साथ सत्यापित:

$ clang --version Apple LLVM version 10.0.0 (clang-1000.11.45.2)


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.