5

मैंने सुना है कि मुझे चक्र बनाए रखने से बचने के लिए हमेशा ब्लॉक में weakSelf का उपयोग करना चाहिए, लेकिन प्रेषण ब्लॉक के बारे में क्या? इस मामले में, मेरी विधि निम्नलिखित कोड में अपने सर्वर से एक त्रुटि प्रतिक्रिया संभालता है:क्या मुझे एक प्रेषण ब्लॉक में "कमजोर" का उपयोग करना चाहिए?

//handling server errors (particularly "Token Refresh Failed" ones) 
-(void)handleServerErrorResponse:(NSString *)error { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     UIAlertController *alertController = [DialogHelper getAlertForSimpleAuthError:error]; 
     if ([error isEqualToString:@"Your login session has expired"]) { 
      [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) 
      { 
       [MyModelDataCenter emptyDataCenter]; 
       [MyAPIInterface sharedInstance].authToken = nil; 
       NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; 
       [defaults removeObjectForKey:@"authToken"]; 
       [defaults removeObjectForKey:@"defaultUserObjectDictionary"]; 
       [defaults synchronize]; 
       [AuthenticationHelper sharedInstance].loggedInUser = nil; 
       [self.navigationController popToRootViewControllerAnimated:YES]; 
      }]]; 
     } 
     else { 
      [alertController addAction:[UIAlertAction actionWithTitle:@"Ok" style:UIAlertActionStyleDefault handler:nil]]; 
     } 
     [self presentViewController:alertController animated:YES completion:nil]; 
    }); 
} 

मैं एक ही मैं अन्य ब्लॉकों में कर के रूप में इस ब्लॉक में weakSelf प्रयोग करना चाहिए?

उत्तर

8

एक सतत बनाए रखने चक्र पर बनाए रखने के लिए आपको केवल को बनाए रखने के चक्र से बचने के लिए कमजोर-मजबूत "नृत्य" का उपयोग करने की आवश्यकता है। कि होने के लिए, दो शर्तें पूरी होनी चाहिए:

  • ब्लॉक एक वस्तु है कि ब्लॉक
  • अंदर संदर्भित है के स्वामित्व में है मालिक अपने स्वयं के आवंटन रद्द करने से पहले ब्लॉक जारी नहीं करता है

यदि इनमें से कोई भी चीज़ सत्य नहीं है, तो कोई लगातार बनाए रखने वाला चक्र नहीं है, और कोई समस्या नहीं है।

इस मामले में, न तो सत्य है। आम तौर पर, प्रेषण कतारों पर रखे गए ब्लॉक चक्रों को बनाए रखने के अधीन नहीं होंगे, जब तक कि आप एक इवर में पुन: उपयोग करने के लिए ब्लॉक को चारों ओर नहीं रखते।

+0

क्या आप इसे बनाए रखने के लिए एक उदाहरण दे सकते हैं? – sbarow

+1

यहां कुछ उदाहरण दिए गए हैं, हालांकि कुछ मध्यवर्ती चरणों के साथ: http://stackoverflow.com/q/11822476/603977 –

+0

इतना अच्छा समझाए जाने के लिए धन्यवाद! और उदाहरण के लिए धन्यवाद! :) – Rafi

5

मुझे भी जोश के साथ सहमत हैं और शुरू से ही सहमत हो गए हैं, वहाँ self weakifying के लिए कोई कारण नहीं है कि, अगर यह (ब्लॉक संदर्भित वस्तु से पकड़ नहीं है), अतीत में बहुमत आवश्यक नहीं है डिफ़ॉल्ट रूप से कमजोर self। (मुझे लगता है कि बहुमत बदल जाता है।)

हालांकि, वहाँ weakify को self भी कोई चक्र को बनाए रखने के लिए एक कारण हो सकता है:

छवि आप एक उदाहरण वस्तु एक लंबे समय से चल ब्लॉक से भर जाता है कि है । यह संभव है कि ब्लॉक चालू होने पर इंस्टेंस ऑब्जेक्ट मर जाएगा, i। ई। क्योंकि उपयोगकर्ता ने इसे हटा दिया। ऐसे मामले में ब्लॉक एक इंस्टेंस ऑब्जेक्ट भर देगा जो अब और उपयोग नहीं कर रहा है और आपके मॉडल से चला गया है, लेकिन अभी भी जिंदा है, क्योंकि ब्लॉक इसे रखता है। इसे कमजोर करने से इसे मुक्त कर दिया जाएगा और कब्जा selfnil पर सेट किया जाएगा, जो जांचना आसान है और आमतौर पर कुछ भी नहीं करता है।

लेकिन मैं वास्तव में नहीं सोचता और कभी सोचा नहीं है कि यह परिदृश्य अंगूठे के नियम को "डिफ़ॉल्ट रूप से कमजोर" मानता है।

+0

क्या आप कह रहे हैं कि यदि सर्वर से प्रतिक्रिया प्राप्त करने के लिए धीमी इंटरनेट कनेक्शन के कारण मेरी एपीआई कॉल में काफी समय लग रहा है, और यदि मैं 'UIViewController' को पॉप करता हूं जिसमें यह त्रुटि हैंडलिंग विधि है, तो मेरा ऐप क्रैश हो जाएगा? – Rafi

+1

नहीं, मैंने यह नहीं कहा। क्या होता है, आपके ठोस कोड पर निर्भर करता है। मैं जो कहता हूं वह है: यदि आपके पास ऑब्जेक्ट का मजबूत संदर्भ है, तो इसे अस्वीकार नहीं किया जाएगा, यहां तक ​​कि कोई और इसका जिक्र नहीं कर रहा है। यह आपके ऐप के साथ क्या करता है - मुझे नहीं पता। –

+0

ठीक है, जानकारी के लिए धन्यवाद। मैं इन चीजों से सावधान रहूंगा :) – Rafi

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