मैं एक एपीआई लिख रहा हूं जिसमें ईवेंट हैंडलिंग शामिल है, और मैं हैंडलर के लिए ब्लॉक का उपयोग करने में सक्षम होना चाहता हूं। कॉलबैक अक्सर स्वयं को एक्सेस या संशोधित करना चाहते हैं। एआरसी मोड में, क्लैंग ने चेतावनी दी है कि स्वयं को संदर्भित करने वाले ब्लॉक एक बनाए रखने चक्र की संभावना है, जो एक उपयोगी चेतावनी की तरह लगता है जिसे मैं सामान्य रूप से रखना चाहता हूं।आत्म-संदर्भ ब्लॉक के लिए आर्क-रिटेन-चक्र चेतावनी को संकुचित रूप से अक्षम करें
हालांकि, मेरे एपीआई के इस हिस्से के लिए, कॉलबैक और युक्त वस्तु का जीवन चक्र बाहरी रूप से बनाए रखा जाता है। मुझे पता है कि जब वस्तु को हटाया जाना चाहिए तो मैं चक्र को तोड़ सकता हूं।
मैं #pragma clang diagnostic ignored "-Warc-retain-cycles"
के साथ प्रति फ़ाइल आधार पर बनाए रखने चक्र चेतावनी को बंद कर सकता हूं, लेकिन यह पूरी फ़ाइल के लिए चेतावनी को अक्षम करता है। मैं उस चेतावनी के आसपास #pragma clang diagnostic push
और pop
के साथ ब्लॉक को घेर सकता हूं, लेकिन यह ब्लॉक बदसूरत बनाता है।
मैं स्वयं को संदर्भित करने के बजाए स्वयं को इंगित करने के लिए एक __weak चर को संदर्भित करके दूर जाने की चेतावनी भी प्राप्त कर सकता हूं, लेकिन यह ब्लॉक को उपयोग करने के लिए बहुत कम सुखद बनाता है।
सबसे अच्छा समाधान मैं ले कर आए हैं इस मैक्रो कि ब्लॉक के चारों ओर नैदानिक अक्षम करना करता है:
#define OBSERVE(OBJ, OBSERVEE, PATH, CODE) \
[(OBJ) observeObject:(OBSERVEE) forKeyPath:(PATH) withBlock:^(id obj, NSDictionary *change) { \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Warc-retain-cycles\"") \
do { CODE; } while(0); \
_Pragma("clang diagnostic pop") \
}];
काम करता है यही कारण है कि, लेकिन यह API उपयोगकर्ताओं के लिए बहुत खोज योग्य नहीं है, यह नेस्टेड की अनुमति नहीं है पर्यवेक्षक, और यह एक्सकोड के संपादक के साथ खराब तरीके से बातचीत करता है। चेतावनी को अक्षम या टालने का कोई बेहतर तरीका है?
'स्वयं' के लिए '__weak' संदर्भ बनाना सचमुच कोड की एक पंक्ति लेता है। मुझे लगता है कि इस मामले में समस्या को ठीक करना लक्षणों को कम करने की कोशिश करने से बेहतर है। 'स्वयं' के बजाय 'कमजोर स्वयं' को संदर्भित करने के लिए ब्लॉक को कम सुखद बनाने का संदर्भ कैसे दिया जाता है? –
यह दो तरीकों से कम सुखद है। श्रोताओं अक्सर बहुत कम होते हैं, कभी-कभी एक ही कथन। __weak घोषणा श्रोता के आकार को दोगुना करती है। इसका मतलब यह भी है कि आपको अनुमानित आत्म का उपयोग करने के बजाय संपत्ति पहुंच अर्हता प्राप्त करने की आवश्यकता है। मैं इस बात से सहमत हूं कि मेरा वर्तमान समाधान शायद __weak का उपयोग करने से भी बदतर है, लेकिन मैं इस प्रश्न के माध्यम से बेहतर एक प्राप्त करने की उम्मीद कर रहा था। –
क्या आप "पूर्ण" तर्क स्वीकार करने के लिए अपने समापन ब्लॉक के प्रोटोटाइप को बदल सकते हैं? अब वह कोड जहां आप अपने ब्लॉक पास करते हैं, वही दिखाई देगा (एक अतिरिक्त तर्क स्वीकार करने के अलावा) और आप चेतावनियों को खत्म कर सकते हैं। (यानी आपके एपीआई ने आपके ब्लॉक पर ऑब्जेक्ट को अपने ब्लॉक में पास कर दिया है) – nielsbot