2009-09-23 21 views
17

मुझे कुछ वस्तुओं को जानने के बिना ऑटोरेलेज्ड होने के बारे में थोड़ा नाराज हो रहा है। यह शायद एक अच्छी बात है कि वे हैं, लेकिन यदि वे हैं, तो मैं जानना चाहता हूं। प्रलेखन यह नहीं कहता कि कौन सी विधियां ऑटोरेलीज ऑब्जेक्ट्स करती हैं, इसलिए मैं आमतौर पर अपने रास्ते की जांच करता हूं, जो मेरी राय में मूर्खतापूर्ण है। उदाहरण के लिए, [एनएसडीएटी तिथि] ऑब्जेक्ट को ऑटोरेलेज़ करता है, और ऐसा करता है [NSArray arrayWithObjects: ...]। दस्तावेज के बिना आपको कैसे पता चलेगा?कैसे पता चलेगा कि कोई ऑब्जेक्ट ऑटोरेलेटेड है या नहीं?

मैं एक पैटर्न देखना शुरू कर रहा हूं हालांकि इन तरीकों से, एक स्थिर कार्य के साथ वस्तुओं को बनाने वाले, हमेशा ऑटोरेलेज्ड ऑब्जेक्ट लौटाते हैं। क्या यह हमेशा सच है?

+0

मेरा मानना ​​है कि आपका मतलब है "क्लास विधि" ("स्थिर विधि" के बजाय "उदाहरण विधि" के विपरीत)। जैसा कि नीचे दिया गया है, +/- यह निर्धारित नहीं करता है कि एक लौटाई गई वस्तु स्वचालित है या नहीं, यह सम्मेलन और सरल नियमों का विषय है। अधिकांश विधियां आपके द्वारा बनाए रखने के लिए ऑब्जेक्ट लौटाती हैं - एक ऑब्जेक्ट को +1 बनाए रखने वाले ऑब्जेक्ट्स को वापस रखने के तरीके नियम के बजाए अपवाद हैं। –

+0

क्लास विधि वास्तव में मेरा मतलब था। मैंने जावा शब्दावली से "स्थैतिक" और किसी कारण से "कार्य" का उपयोग किया, हालांकि यह "विधि" होना चाहिए था। खैर, वैसे भी वे सभी स्मृति में समान हैं। :) – quano

उत्तर

21

मूल रूप से, यदि आप init, copy, या retain कोई ऑब्जेक्ट जो आप इसे जारी करने के लिए ज़िम्मेदार हैं। यदि आप नहीं करते हैं, तो आप इसे जारी करने के लिए ज़िम्मेदार नहीं हैं।

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

कई कक्षाओं प्रपत्र + className ... के तरीकों है कि आप का उपयोग कर सकते वर्ग का एक नया उदाहरण प्राप्त प्रदान करते हैं। अक्सर "सुविधा कन्स्ट्रक्टर" के रूप में जाना जाता है, ये विधियां कक्षा का नया उदाहरण बनाती हैं, प्रारंभ करें, और इसे उपयोग करने के लिए इसे वापस कर दें। हालांकि आपको लगता है कि आप ऑब्जेक्ट्स जारी करने के लिए ज़िम्मेदार हैं, जो स्वामित्व नीति के अनुसार पहले सेट किए गए हैं। चूंकि वर्ग नई ऑब्जेक्ट बनाता है, यह नया ऑब्जेक्ट का निपटान करने के लिए ज़िम्मेदार है।

+0

यह भी एक अच्छा जवाब है। – bobobobo

4

विधि हस्ताक्षर स्वयं आपको बताता है। हस्ताक्षर के साथ तरीकों का पैटर्न "classNameWithData: data1: data2" उस चीज़ के आवंटन/init/autorelease उदाहरण को वापस करना है। वे वहां सुविधाएं हैं ताकि आपको ऐसा करने की आवश्यकता न हो।

यदि आप किसी चीज़ का ऑटोरेलीज़ संस्करण नहीं चाहते हैं, तो उन्हें इस तरह से तुरंत चालू न करें, और उचित आवंटन/init का उपयोग करें, और जब आप पूरा कर लें तो रिलीज़ करें। यह विधि अधिक स्पष्ट है, और थोड़ी अधिक त्रुटि प्रवण है क्योंकि यदि कोई अपवाद फेंक दिया गया है तो आपका रिलीज ब्लॉक मिस्ड हो सकता है, लेकिन यह वह कीमत है जिसका आप भुगतान करते हैं।

+0

+1। यदि आप ऑब्जेक्ट प्राप्त करने के लिए एलोक/इनिट का उपयोग नहीं कर रहे हैं, तो मान लें कि यह ऑटोरेलेज्ड है और इसे उचित तरीके से संभाल लें। – Abizern

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

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