Xcode 7.3 मैन्युअल संदर्भ गणना का उपयोग करके फ़ाइल में __weak संदर्भ नहीं बना सकता है


86

Xcode 7.3 में अद्यतन करने के बाद, यह Cannot create __weak reference in file using manual reference countingपॉड फ़ाइलों में त्रुटि को फेंकता है । क्या किसी ने इस मुद्दे को हल किया है?

जवाबों:


176

को सेट Build Settings -> Apple LLVM 7.1 - Language - Objective C -> Weak References in Manual Retain Releaseकरें YES

दृश्य उदाहरण

Apple डेवलपर्स फ़ोरम से लिया गया - Xcode 7.3b4, गैर-चाप, __weak संदर्भ नहीं बना सकता है


7
यह अभी भी मेरे लिए काम नहीं करता है :( क्या कोई अन्य संकलक ध्वज हो सकता है जो इस सेटिंग को ओवरराइड करता है जो मैंने सक्षम किया हो सकता है? मेरे पास ये -Wall -Wextra -Wno-unused-parameterचेतावनी झंडे सक्षम हैं।
Kdawgwilk

6
@Kdawgwilk क्या आप निश्चित रूप से उस ध्वज को सही ढंग से चालू करते हैं? यदि आपके प्रोजेक्ट में इसका उपयोग आप केवल __weak कीवर्ड थियो को हटा सकते हैं। मैंने कोशिश नहीं की, लेकिन यदि आप फली
REALFREE

3
ध्यान दें कि यदि आप वर्तमान में पॉड इंस्टॉल / पॉड अपडेट चलाते हैं, तो मैनुअल रिटेन रिलीज में कमजोर संदर्भ प्रत्येक पॉड टारगेट के लिए NO पर सेट होता है - और आपको फिर से बिल्ड सेटिंग्स को संपादित करना होगा।
दामो

2
मुझे यह पॉड प्रोजेक्ट सेटिंग में भी करना था।
बर्नार्ड

भयानक जवाब दोस्तों।
बार्टोलोमिएज सेमेकोज़ी

21

यह लिंक से Apple का आधिकारिक उत्तर है:

यह समस्या निम्नलिखित के आधार पर व्यवहार करती है: हम सभी उद्देश्य-सी भाषा मोड में कमजोर संदर्भों को लागू करने की प्रक्रिया में हैं। चूंकि "__weak" को गैर-एआरसी (और गैर-जीसी) भाषा मोड में ऐतिहासिक रूप से अनदेखा किया गया है, इसलिए हमने इस त्रुटि को उन स्थानों को इंगित करने के लिए जोड़ा है जहां भविष्य में शब्दार्थ बदल जाएगा। कृपया अपनी बग रिपोर्ट अपडेट करें, हमें बताएं कि क्या यह अभी भी आपके लिए एक समस्या है।

इसलिए मूल रूप से, यदि आप तीसरी पार्टी लाइब्रेरी के लिए पॉड का उपयोग कर रहे हैं, तो आपको या तो गैर-एआरसी में __weak को हटाना होगा या अपडेट की प्रतीक्षा करनी होगी।

अपडेट करें 3/23

मुझे उन झंडों के बारे में अधिक शोध करना चाहिए जिन्हें मैं इन थोड़े सामानों को बायपास करने के लिए अनिवार्य रूप से पास कर सकता हूं। लेकिन मौलिक रूप से आपको __weakकिसी भी अप्रत्याशित संघर्ष से बचने के लिए अब से गैर-एआरसी मोड में उपयोग नहीं करना चाहिए । कोकोपोड्स उपयोगकर्ताओं के लिए, आपको __weakअपडेट के लिए हटाने या प्रतीक्षा करने की आवश्यकता नहीं है लेकिन Weak References in Manual Retain Releaseबिल्ड सेटिंग्स में ध्वज को यस की तरह सेट करें जैसे लीन ने कहा। उममीद है कि इससे मदद मिलेगी।


1
ध्यान दें कि यदि आप वर्तमान में पॉड इंस्टॉल / पॉड अपडेट चलाते हैं, तो मैनुअल रिटेन रिलीज में कमजोर संदर्भ प्रत्येक पॉड टारगेट के लिए NO पर सेट होता है - और आपको फिर से बिल्ड सेटिंग्स को संपादित करना होगा।
दामो

20

इसे हल करने का सबसे अच्छा तरीका post_installअपने पॉडफाइल में एक स्क्रिप्ट जोड़ना है जो आपके सभी पॉड लक्ष्यों में Weak References in Manual Retain Releaseध्वज को सेट yesकरता है। ऐसा करने के लिए बस अपने नीचे दिए गए कोड को पेस्ट करें Podfile

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
        end
    end
end

कभी-कभी, ऐसा करने से त्रुटि होती है -fobjc-weak is not supported on the current deployment target। आप एक और कॉन्फ़िगरेशन विकल्प जोड़कर हल कर सकते हैं, सभी पॉड्स को उस संस्करण को लक्षित करने के लिए मजबूर कर सकते हैं ( इस उत्तर के आधार पर ):

post_install do |installer_representation|
    installer_representation.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
            config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '9.3'
        end
    end
end

महान विचार! यह मेरे लिए काम कर रहा है, क्योंकि मैं कोकोपोड्स का उपयोग कर रहा हूं। धन्यवाद।
मेजिनियस

3
मुझे फोलविंग त्रुटि मिली: -फोबजेक-कमजोर को वर्तमान तैनाती लक्ष्य पर समर्थित नहीं है
g212gs

मुझे -fobjc- कमज़ोर त्रुटि भी मिली, लेकिन सभी फली तैनाती लक्ष्य को 8.3 (मेरी परियोजना परिनियोजन लक्ष्य) को सेट करके इसे ठीक करने में कामयाब रहे। आप इसे एक स्क्रिप्ट के साथ कर सकते हैं, जैसा कि ऊपर 2 स्क्रिप्ट में सुझाया गया है।
14

8

FBSettings.m में फेसबुक कमजोर संदर्भों के लिए समाधान

पॉडफाइल के लिए, पॉड इंस्टॉल / अपडेट के बाद चलाने के लिए एक स्क्रिप्ट लिखना संभव है, निम्नलिखित का वर्णन करता है।

 
post_install do | installer |
     classy_pods_target = installer.pods_project.targets.find {| target | target.name == 'Facebook-iOS-SDK'}
     classy_pods_target.build_configurations.each do | config |
         config.build_settings['CLANG_ENABLE_OBJC_WEAK'] ||= 'YES'
     end
 end

CLANG_ENABLE_OBJC_WEAK कैसे जादू के शब्दों को खोजने के लिए। मान्य XHTML


1
बस एक नोट: लगता है जैसे एफबी ने 3.x रिलीज लाइन के लिए v3.24.4 में आक्रामक लाइन को बदल दिया है। (4.x श्रृंखला के बारे में निश्चित नहीं है, लेकिन ऐसा नहीं लगता कि यह अभी है।)
big_m

7

मुझे यह मिल गया है।

मुझे लगता है कि इसका मतलब __weak हटाना है

https://forums.developer.apple.com/thread/38934

एर्म, क्या एमआरआर [मैनुअल रिटेन-रिलीज] के तहत कमजोर चर संदर्भ के रूप में कभी ऐसा था? "__weak" का अर्थ एक या दो चीजों से है:

  1. एक प्रसिद्ध संदर्भ (यानी एक प्रतिधारण का प्रतिनिधित्व नहीं)।

  2. एक शून्य संदर्भ (यानी कि जब संदर्भित वस्तु को हटा दिया जाता है तो रनटाइम शून्य हो जाता है)।

# 1 MRR पर लागू नहीं होता है, क्योंकि आप अभी भी चर को बनाए नहीं रखते हैं।

# 2 MRR पर लागू नहीं होता है, क्योंकि रनटाइम सपोर्ट GC और ARC [ऑटोमैटिक रेफरेंस काउंटिंग] में है, जिसका आप उपयोग नहीं कर रहे हैं।

ऐसा लगता है कि कंपाइलर अब केवल शिकायत कर रहा है कि वह ऐसा नहीं कर सकता जो वह कभी नहीं कर सकता। (और एक ऐप डेलीगेट के मामले में, आप रन-टाइम में अंतर नहीं बता पाएंगे, क्योंकि ऐप डेलीगेट को आम तौर पर कभी नहीं हटाया जाता है।)


1

बस "कम्पोज़ सोर्सेस" में पॉड फ़ाइलों के लिए "बिल्ड चरणों" टैब लुक में अपना लक्ष्य प्राप्त करें, उन फ़ाइलों पर क्लिक करें और कंपाइलर फ़्लैग जोड़ें "-fobjc-arc"


0

या __weakकरने के लिए बदल जाते हैं __unsafeunretained। इससे परंपरा में समस्या का समाधान होगा। चूंकि MRC (xCode 4 से पहले) __weak iOS में नहीं था।

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