2015-03-02 6 views
5

ReactiveCocoa में @weakify और @strongify को बनाए रखने से रोकने के लिए मैक्रो है। मेरी समझ से @weakify ऐसा कुछ करें जो मैं आमतौर पर करता हूं जो ब्लॉक में उपयोग करने के लिए __weak संदर्भ बनाता है, लेकिन @strongify के बारे में क्या है?@strongify

मुझे ब्लॉक में इसे फिर से मजबूत करने की आवश्यकता क्यों है?

@weakify(self); 
[RACObserve(self, username) subscribeNext:^(NSString *username) { 
    @strongify(self); 
    [self validateUsername]; 
}]; 
+1

आपको जो स्थिति आपने पोस्ट की है उस स्थिति में ब्लॉक के अंदर फिर से _strong_ संदर्भ बनाने की आवश्यकता नहीं है, इससे कोई फर्क नहीं पड़ता - लेकिन यदि आप एक ही 'स्वयं' ऑब्जेक्ट में कई बार संदर्भित करेंगे और आप चाहते हैं यह सुनिश्चित करने के लिए कि जब तक ब्लॉक अपने दायरे से बाहर नहीं हो जाता तब तक 'स्वयं' मान्य होता है (इसलिए आपका ब्लॉक आपके 'स्वयं' पर आधा काम नहीं करेगा), आपको इसे _strong_ प्राप्त करने की आवश्यकता है। – holex

उत्तर

5

तुम सिर्फ ब्लॉक के भीतर एक कमजोर संदर्भ का उपयोग करते हैं, स्वयं जबकि ब्लॉक निष्पादित किया जा रहा है पुनः आवंटित की जाती प्राप्त कर सकते हैं:

कुछ नमूने यहां उपयोग है। लेकिन अगर आप यह सुनिश्चित करना चाहते हैं कि जब तक ब्लॉक निष्पादन समाप्त नहीं हो जाता तब तक स्मृति में रहता है, आपको कमजोर संदर्भ को मजबूत में परिवर्तित करना होगा।

+0

लेकिन यदि स्वयं को हटा दिया गया है तो इसका मतलब यह नहीं है कि मुझे इस ब्लॉक में अब कोई रूचि नहीं है? इसे निष्पादित भी नहीं किया जाना चाहिए क्योंकि इसे स्वयं के साथ हटा दिया गया है? – sarunw

+0

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

+0

तो यह मजबूत है कि 'EXC_BAD_ACCESS' को ब्लॉक में दाएं सेने वाले स्वयं का उपयोग करने से रोकने के लिए? – sarunw