दोनों को बनाए रखने और autorelease, कार्यात्मक एक वस्तु को बनाए रखने, लेकिन वे विलय नहीं है। मतभेद यह है कि बनाए रखने की गणना केवल किसी अन्य वस्तु द्वारा घटित की जा सकती है जबकि एनएसएयूटोरिलीपूल को निकालने पर ऑटोरेलेज्ड गणना स्वचालित रूप से घट जाती है। यदि पूल नाली के समय तक किसी अन्य वस्तु ने ऑटोरेलेज्ड ऑब्जेक्ट को बरकरार रखा है, तो यह पोफ जाता है।
असल में, आप ऑटोरेलीज का उपयोग करते हैं जब आप यह सुनिश्चित करना चाहते हैं कि कोई ऑब्जेक्ट वर्तमान विधि में चारों ओर लटकता है और अन्य ऑब्जेक्ट्स को पास किया जा सकता है लेकिन आप इसे अपने रिलीज़ को ट्रैक नहीं करना चाहते हैं।
आपके उदाहरण कोड में, ऑटोरेलीज केवल एक सुरक्षा उपाय है। NSPredicate ऑब्जेक्ट जारी किया गया है क्योंकि इसकी नौकरी समाप्त हो गई है लेकिन कोडर यह सुनिश्चित करना चाहता था कि NSFetchRequest ऑब्जेक्ट चारों ओर लटका हुआ हो। इस उदाहरण में आपको "autorelease" का उपयोग करने की आवश्यकता नहीं है, लेकिन अगर आप अपनी रिलीज की गिनती खो देते हैं तो fetchRequest गायब हो सकता है।दूसरी तरफ, आप इसे अनाथ और लीक नहीं करना चाहते हैं ताकि ऑब्जेक्ट पूल को निकालने पर साफ करने के लिए आप ऑटोरेलीज का उपयोग करें।
ऑटोरेलीज का सबसे आम उपयोग तब होता है जब आप प्रत्येक बार ऑब्जेक्ट्स की एक चर संख्या बना रहे हैं। आप उन सभी को ट्रैक नहीं करना चाहते हैं ताकि आप उन्हें ऑटोरेलीज़ कर सकें और पूल को उनकी देखभाल कर सकें। (इससे भी बेहतर, आप एक स्थानीय पूल बनाते हैं और जैसे ही आप इसे पूरा करते हैं।)
ऐप्पल एपीआई मानक में, कोई भी विधि जो कुंजी शब्द 'init', 'new' या 'create' के बिना एक नई वस्तु बनाता है 'एक ऑटोरेलेज्ड ऑब्जेक्ट देता है।
-[NSString initWithString:]
autorelease नहीं है लेकिन - [NSString stringWithString:] है। इससे गैर-कचरा संग्रहण वातावरण में समस्याएं आती हैं क्योंकि stringWithString:
एक स्ट्रिंग देता है जो एक बनाए गए ऑब्जेक्ट की तरह व्यवहार करता प्रतीत होता है लेकिन बाद में यह अचानक यादृच्छिक रूप से गायब हो जाता है जब ऑटोरेलीज पूल इसे नालियों में बनाया गया था।
Edit01: से एप्पल डॉक्स
एक autorelease पूल NSAutoreleasePool का एक उदाहरण है कि "शामिल है" अन्य वस्तुओं है कि एक autorelease संदेश प्राप्त हुआ है है; जब ऑटोरेलीज पूल को हटा दिया गया है तो इसे उन ऑब्जेक्ट्स में से प्रत्येक को रिलीज़ संदेश भेजता है। एक ऑब्जेक्ट को एक ऑटोरेलीज पूल में कई बार डाल दिया जा सकता है, और प्रत्येक बार इसे पूल में डाला जाने के लिए रिलीज संदेश प्राप्त होता है। इस प्रकार, एक वस्तु को autorelease बजाय की रिहाई भेजने पूल ही जारी किया (वस्तु लंबे समय तक जीवित हो सकता है अगर यह अंतरिम में बनाए रखा है) है जब तक कम से कम उस वस्तु की जीवन फैली हुई है।
बरकरार गणना और autorelease दोनों एक ही मूल (लेकिन अलग) गिनती तंत्र द्वारा जीवित वस्तु को जीवित रखते हैं। मुख्य अंतर यह है कि स्वामित्व वाली वस्तु रिलीज भेजती है। बनाए रखा गिनती के साथ, इसकी दूसरी वस्तु लेकिन एक ऑटोरेलेज्ड के लिए ऑटोरलीज पूल की गणना करता है।
यह सबसे संक्षिप्त व्याख्या है जिसे मैंने autorelease के लिए पढ़ा है। – TechZen
वास्तव में बहुत अच्छा जवाब! +! –