दिलचस्प पोस्ट
पायथन उपयोगकर्ता से एक अक्षर पढ़ता है GCC C ++ "हैलो वर्ल्ड" प्रोग्राम -> .exe 500kb बड़ा है जब Windows पर संकलित किया गया मैं इसका आकार कैसे घटा सकता हूं? एक क्लासपाथ को पहचानने के लिए एंटी <javac> प्राप्त करना पंक्ति-स्तरीय ट्रिगर बनाम स्टेटमेंट-स्तरीय ट्रिगर जावा में JButton से JComponent तक खींचें और ड्रॉप करें Xcode 4 में एक यूनिवर्सल ऐप पर iPhone ऐप परिवर्तित करना Iquatable और बस ओवरराइड ऑब्जेक्ट के बीच अंतर क्या है। एक्वा ()? टी-एसक्यूएल में तिथियों की तुलना करें, समय के भाग की अनदेखी करें सूचियों पर डेल, निकालें और पॉप के बीच का अंतर एनएसटी टाइमर 15 एमएस रिजोल्यूशन तक सीमित क्यों हैं? स्विफ्ट 3 में यूआरएल कैसे खोलें एंड्रॉइड पर कुछ डिवाइसेज़ पर कैमेरा इंटेन्ट का उपयोग करके एक छवि कैद क्यों हो जाती है? Angular.js निर्देश गतिशील टेम्पलेट URL सी # यादृच्छिक संख्या जेनरेटर थ्रेड सुरक्षित है? एंड्रॉइड लेआउट xml में पृष्ठभूमि, पृष्ठभूमिटिंट, पृष्ठभूमिटिंटमोद विशेषताओं के बीच अंतर क्या है?

क्या एआरसी का उपयोग करते समय क्या मैं डेलोक में संपत्ति को शून्य में सेट कर सकता हूं?

मैं iOS 5 में स्वचालित संदर्भ गणना सीखने की कोशिश कर रहा हूं। अब इस प्रश्न का पहला भाग आसान होना चाहिए:

  1. क्या यह सही है कि मुझे एआरसी का उपयोग करते समय मेरे रिलीज-प्रॉपर्टी स्टेटमेंट को मेरे डेअलोक में लिखने की आवश्यकता नहीं है? दूसरे शब्दों में, क्या यह सच है कि निम्नलिखित को एक स्पष्ट dealloc की आवश्यकता नहीं है?

    @interface MyClass : NSObject @property (strong, nonatomic) NSObject* myProperty; @end @implementation MyClass @synthesize myProperty; @end 
  2. मेरा अगला और अधिक महत्वपूर्ण प्रश्न ट्रांजिशनिंग एआरसी रिलीज नोट्स दस्तावेज़ में एक पंक्ति से आता है:

    आपके पास (वास्तव में) उदाहरण चर को रिलीज़ नहीं किया जा सकता है, लेकिन आपको सिस्टम वर्गों और अन्य कोड पर [स्व सेट डिलीएगेट: शून्य] को लागू करने की आवश्यकता हो सकती है जो एआरसी का उपयोग करते हुए संकलित नहीं है।

    यह प्रश्न पूछता है: मैं कैसे जानता हूं कि एआरसी से कौन सी सिस्टम कक्षाएं संकलित नहीं हैं? मुझे अपना खुद का डेलोक कब बनाना चाहिए और स्पष्ट रूप से संपत्तियों को बनाए रखने के लिए निबन्ध स्थापित करना चाहिए? क्या मुझे मानना ​​चाहिए कि गुणों में प्रयुक्त सभी एनएस और यूआई फ्रेमवर्क वर्गों को स्पष्ट deallocs की आवश्यकता है?

एआरसी का उपयोग करते समय मैन्युअल संदर्भ ट्रैकिंग का उपयोग करते समय एक संपत्ति के बैकिंग ivar को जारी करने की प्रथाओं पर एसओ और अन्यत्र की जानकारी का एक धन है, लेकिन इसके बारे में अपेक्षाकृत कम है।

Solutions Collecting From Web of "क्या एआरसी का उपयोग करते समय क्या मैं डेलोक में संपत्ति को शून्य में सेट कर सकता हूं?"

संक्षिप्त जवाब : नहीं, आपको एआरसी के तहत dealloc में संपत्तियों को बाहर करने की ज़रूरत नहीं है।

लंबे समय से उत्तर : आपको dealloc में संपत्तियों को कभी भी शून्य नहीं करना चाहिए, यहां तक ​​कि मैनुअल मेमोरी प्रबंधन में भी।

एमआरआर में, आपको अपने इवर को छोड़ना चाहिए गुणों को समाप्त करना, सेटर्स कहने का मतलब है, जो कोड को लागू कर सकता है जिसे इसे डेलोक में नहीं छूना चाहिए (जैसे यदि आपका क्लास या उपवर्ग, सेटर को ओवरराइड करता है)। इसी तरह यह केवीओ सूचनाएं चालू कर सकता है Ivar जारी करने के बजाय इन अवांछित व्यवहार से बचा जाता है

एआरसी में, सिस्टम स्वचालित रूप से आपके लिए किसी भी आयवर को रिलीज़ करता है, इसलिए यदि आप ऐसा कर रहे हैं तो आपको dealloc लागू करने की आवश्यकता नहीं है। हालांकि, अगर आपके पास कोई गैर ऑब्जेक्ट आइवर है जिसे विशेष हैंडलिंग की आवश्यकता होती है (जैसे कि आवंटित बफ़र्स जिन्हें आपको free() आवश्यकता है) आपको dealloc में उन लोगों से निपटना होगा

इसके अलावा, यदि आपने खुद को किसी भी ऑब्जेक्ट के प्रतिनिधि के रूप में सेट किया है, तो आपको [obj setDelegate:nil] में उस संबंध को अन-सेट करना चाहिए (यह कॉल करने के बारे में थोड़ा सा है [obj setDelegate:nil] ) एआरसी के साथ संकलित नहीं किए गए वर्गों पर ऐसा करने के बारे में नोट कमजोर गुणों की ओर अग्रसर है। अगर क्लास स्पष्ट रूप से अपने delegate संपत्ति को weak मानता है तो आपको ऐसा करने की ज़रूरत नहीं है, क्योंकि कमजोर गुणों की प्रकृति का मतलब है कि यह आपके लिए बिलकुल ख़राब हो जाएगा। हालांकि, यदि संपत्ति को assign है, तो आपको इसे अपने dealloc में बाहर करना चाहिए, अन्यथा क्लास एक लटकने वाला सूचक के साथ छोड़ा जाता है और संभवतः दुर्घटना होगा यदि वह अपने प्रतिनिधि को संदेश भेजने का प्रयास करता है ध्यान दें कि यह केवल गैर-बनाए रखने के संबंधों पर लागू होता है, जैसे प्रतिनिधि

बस विपरीत उत्तर देने के लिए …

संक्षिप्त जवाब : नहीं, आपको एआरसी के तहत dealloc में ऑटो-संश्लेषित गुणों को समाप्त नहीं करना पड़ता है। और आपको उन लोगों के लिए सेटर का उपयोग करने की ज़रूरत नहीं है जो कि init

लंबे समय से जवाब : आपको dealloc तहत भी dealloc में कस्टम-संश्लेषित गुणों को बाहर करना चाहिए । और आपको init में उन लोगों के लिए सेटर का उपयोग करना चाहिए।

मुद्दा यह है कि आपकी कस्टम-संश्लेषित गुणों को सुरक्षित और सममित होना चाहिए, जो नलीकरण के संबंध में है।

टाइमर के लिए एक संभावित सेटर:

 -(void)setTimer:(NSTimer *)timer { if (timer == _timer) return; [timer retain]; [_timer invalidate]; [_timer release]; _timer = timer; [_timer fire]; } 

स्क्रॉलएव्यू, टेबलव्यूव, वेबव्यू, टेक्सफील्ड, के लिए एक संभावित सेटर: …

 -(void)setScrollView:(UIScrollView *)scrollView { if (scrollView == _scrollView) return; [scrollView retain]; [_scrollView setDelegate:nil]; [_scrollView release]; _scrollView = scrollView; [_scrollView setDelegate:self]; } 

केवीओ प्रॉपर्टी के लिए एक संभावित सेटर:

 -(void)setButton:(UIButton *)button { if (button == _button) return; [button retain]; [_button removeObserver:self forKeyPath:@"tintColor"]; [_button release]; _button = button; [_button addObserver:self forKeyPath:@"tintColor" options:(NSKeyValueObservingOptions)0 context:NULL]; } 

उसके बाद आपको didReceiveMemoryWarning के लिए कोई भी कोड डुप्लिकेट नहीं करना होगा, didReceiveMemoryWarning , didReceiveMemoryWarning , … और आपकी संपत्ति को सुरक्षित रूप से सार्वजनिक किया जा सकता है यदि आप dealloc में संपत्तियों के बारे में चिंतित हैं, तो यह समय हो सकता है कि आप फिर से अपने सेटर्स की जांच करें।