दिलचस्प पोस्ट
कॉलम में एकाधिक मानों के साथ प्रश्न क्या jQuery "चयनकर्ताओं" का कैशिंग करता है? JTree में JTable रखें एडीओडीबी और सामान्य वेबसाइट सुरक्षा में एसक्यूएल इंजेक्शन एंड्रॉइड में प्रगति बार की प्रगति रंग कैसे बदल सकता है क्या मैप्टललिब में एक कैप्शन बॉक्स खींचने का एक तरीका है HTML में प्रदर्शित करने के लिए ऊपर / नीचे त्रिकोण (बिना स्टेम के तीर) के लिए कौन-से पात्रों का उपयोग किया जा सकता है? क्यों एक धागा पैदा कर रही है महंगा हो कहा? Android – चेकबॉक्स और टेक्स्ट के बीच की दूरी DOM हटाने के साथ jQuery मेमोरी रिसाव जावा 6 में टीएलएस 1.2 का उपयोग कैसे करें सी में लूप करते समय अल्पविराम से अलग अभिव्यक्ति एक निर्देशिका में फ़ाइलों का बैच पुनर्नामकरण ग्लासफिश में मोजररा संस्करण को कैसे अपडेट करें क्यों असेंक का प्रयोग करें / सामान्य थ्रेडिंग या कार्य के प्रतीक्षारत?

एआरसी-सक्षम कोड में "इस ब्लॉक में दृढ़ता से एक बनाए रखने के चक्र की ओर बढ़ने की संभावना है" चेतावनी को ठीक करें

एआरसी सक्षम कोड में, ब्लॉक-आधारित एपीआई का उपयोग करते समय एक संभावित बनाए रखने के चक्र के बारे में एक चेतावनी कैसे तय की जाए?

चेतावनी:
Capturing 'request' strongly in this block is likely to lead to a retain cycle

कोड के इस स्निपेट द्वारा निर्मित:

 ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:... [request setCompletionBlock:^{ NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.rawResponseData error:nil]; // ... }]; 

चेतावनी ब्लॉक के अंदर ऑब्जेक्ट request के उपयोग से जुड़ा हुआ है।

Solutions Collecting From Web of "एआरसी-सक्षम कोड में "इस ब्लॉक में दृढ़ता से एक बनाए रखने के चक्र की ओर बढ़ने की संभावना है" चेतावनी को ठीक करें"

अपने आप से जवाब दे रहा हूं:

प्रलेखन के बारे में मेरी समझ में कहा गया है कि block इसे इस्तेमाल करने के बाद कीवर्ड block और शून्य को चर के लिए सेट करना ठीक होना चाहिए, लेकिन यह अभी भी चेतावनी दिखाता है

 __block ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:... [request setCompletionBlock:^{ NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.responseData error:nil]; request = nil; // .... }]; 

अपडेट: इसे ' _block' के बजाय '_ weak' कीवर्ड के साथ काम करने और अस्थायी चर का उपयोग करने के लिए मिला है:

 ASIHTTPRequest *_request = [[ASIHTTPRequest alloc] initWithURL:... __weak ASIHTTPRequest *request = _request; [request setCompletionBlock:^{ NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:request.responseData error:nil]; // ... }]; 

यदि आप आईओएस 4 को भी लक्षित करना चाहते हैं, तो __unsafe_unretained बजाय __unsafe_unretained उपयोग करें। समान व्यवहार, लेकिन सूचक ऑब्जेक्ट नष्ट होने पर स्वतः सेट होने के बजाय झूलने पर रहता है।

समस्या इसलिए होती है क्योंकि आप अनुरोध करने के लिए एक ब्लॉक निर्दिष्ट कर रहे हैं जिसमें उसमें अनुरोध करने के लिए एक मजबूत संदर्भ है ब्लॉक स्वचालित रूप से अनुरोध को बरकरार रखता है, इसलिए मूल अनुरोध चक्र की वजह से डीलोकेट नहीं करेगा। सही बात?

यह सिर्फ अजीब है क्योंकि आप __ब्लॉक के साथ अनुरोध ऑब्जेक्ट टैग कर रहे हैं, इसलिए यह स्वयं को संदर्भित कर सकता है। आप इसके साथ एक कमजोर संदर्भ बनाकर इसे ठीक कर सकते हैं।

 ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:...]; __weak ASIHTTPRequest *wrequest = request; [request setCompletionBlock:^{ NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:wrequest.rawResponseData error:nil]; // ... }]; 

यह ब्लॉक में स्वयं को बनाए रखने के कारण होता है ब्लॉक स्वयं से प्रवेश किया जाएगा, और स्वयं ब्लॉक में निर्दिष्ट है। यह एक बनाए चक्र बनाएगा

self एक कमजोर रिफ्लेजेस बनाकर इसे सुलझाने का प्रयास करें

 __weak typeof(self) weakSelf = self; operationManager = [[AFHTTPRequestOperation alloc] initWithRequest:request]; operationManager.responseSerializer = [AFJSONResponseSerializer serializer]; [operationManager setCompletionBlockWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { [weakSelf requestFinishWithSucessResponseObject:responseObject withAFHTTPRequestOperation:operation andRequestType:eRequestType]; } failure:^(AFHTTPRequestOperation *operation, NSError *error) { [weakSelf requestFinishWithFailureResponseObject:error withAFHTTPRequestOperation:operation andRequestType:eRequestType]; }]; [operationManager start]; 

कभी-कभी एक्सकोड कंपाइलर में पहचाने जाने वालों के लिए पहचाने जाने वाले समस्याएं होती हैं, इसलिए यदि आप सुनिश्चित हैं कि आप पूर्णता नहीं रखते हैं तो आप इस तरह एक संकलक ध्वज रख सकते हैं:

 #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-retain-cycles" #pragma clang diagnostic ignored "-Wgnu" -(void)someMethod { } 

जब मैं गुइल्लाम द्वारा प्रदान किए गए समाधान की कोशिश करता हूं, तो सब कुछ ठीक डीबग मोड में होता है लेकिन यह रिलीज़ मोड में क्रैश हो जाता है।

ध्यान दें कि __वेक का प्रयोग न करें लेकिन __unsafe_unretained क्योंकि मेरा लक्ष्य आईओएस 4.3 है।

सेट कोड पूर्ण होने पर मेरा कोड क्रैश: ऑब्जेक्ट "अनुरोध" पर कहा जाता है: अनुरोध को रद्द कर दिया गया था …

इसलिए, यह समाधान डीबग और रिलीज मोड में दोनों काम करता है:

 // Avoiding retain cycle : // - ASIHttpRequest object is a strong property (crashs if local variable) // - use of an __unsafe_unretained pointer towards self inside block code self.request = [ASIHttpRequest initWithURL:... __unsafe_unretained DataModel * dataModel = self; [self.request setCompletionBlock:^ { [dataModel processResponseWithData:dataModel.request.receivedData]; }]; 
 ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:... __block ASIHTTPRequest *blockRequest = request; [request setCompletionBlock:^{ NSDictionary *jsonDictionary = [[CJSONDeserializer deserializer] deserialize:blockRequest.responseData error:nil]; blockRequest = nil; // .... }]; 

__weak और __block संदर्भ के बीच अंतर क्या है?

एप्पल डेवलपर वेबसाइट पर प्रलेखन देखें : https://developer.apple.com/library/prerelease/ios/#documentation/General/Conceptual/ARCProgrammingGuide/Introduction.html#//apple_ref/doc/uid/TP40011029

पृष्ठ के निचले भाग में चक्र रखने के बारे में एक खंड है।