2010-01-29 10 views
12

कोर डेटा प्रोग्रामिंग गाइड से निम्न कोड उदाहरण में, NSFetchRequest को ऑटोोरलीज़ के साथ बनाया गया है जबकि NSSortDescriptor autorelease के साथ नहीं बनाया गया है। NSSortDescriptor autorelease के साथ क्यों नहीं बनाया गया था? क्या यह वरीयता का मामला है?Autorelease या Autorelease के लिए नहीं

NSManagedObjectContext *moc = [self managedObjectContext];  
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Employee" 
                inManagedObjectContext:moc]; 

NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease]; 
[request setEntity:entityDescription]; 
// Set example predicate and sort orderings... 
NSNumber *minimumSalary = ...; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(lastName LIKE[c]'Worsley') AND (salary > %@)", minimumSalary];  
[request setPredicate:predicate]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" 
                   ascending:YES]; 
[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]]; 
[sortDescriptor release]; 
NSError *error; 
NSArray *array = [moc executeFetchRequest:request error:&error]; 
if (array == nil){ 
    // Deal with error... 
} 

उत्तर

35

जब आप ऑटोरेलीज करते हैं, तो आप मूल रूप से कह रहे हैं: "मुझे अब इसकी आवश्यकता नहीं है, लेकिन कोई भी इसे लेने के लिए स्वतंत्र है (ऑटो रिलीज पूल निकालने से पहले)"। जब आप स्पष्ट रूप से किसी ऑब्जेक्ट को रिलायंस करते हैं तो आप कह रहे हैं: "मुझे अब इसकी आवश्यकता नहीं है और जब तक कि किसी और ने पहले से ही (अधिग्रहित) नहीं कहा है, इसे तुरंत हटा दिया जाना चाहिए।"

नतीजतन, autorelease सामान्य रूप से करने के लिए गलत बात नहीं है। यह आवश्यक है जब आप ऑब्जेक्ट को जारी करने की देखभाल करने के लिए प्रेषक की आवश्यकता के बिना किसी संदेश के प्रेषक को ऑब्जेक्ट पास करना चाहते हैं।

+1

यह सबसे संक्षिप्त व्याख्या है जिसे मैंने autorelease के लिए पढ़ा है। – TechZen

+0

वास्तव में बहुत अच्छा जवाब! +! –

26

autorelease करने के लिए या नहीं करने के लिए autorelease सवाल यह है कि

है।

क्या कोडर के लिए टिस नोबलर मेमोरी लीक के स्लिंग्स और तीरों को पीड़ित करता है या संदर्भित पॉइंटर्स के समुद्र के खिलाफ हथियार लेता है और उन्हें बनाए रखता है, उन्हें समाप्त कर देता है ... कामना करने के लिए ईमानदारी से एक समाप्ति है! अरे, रगड़ है! ... जारी किए गए ऑब्जेक्ट्स में उन लोगों के लिए, जब हम उन ऑब्जेक्ट्स का संदर्भ देते हैं जो हमें नहीं हैं तो हमें क्या रोकना चाहिए।

मैं खुद की मदद नहीं कर सका। मैं प्रतिनिधि हिट ले जाऊंगा। मुझे कोई अफसोस नहीं है!

+0

+0: आपको पहले से ही चार अंक मिल गए हैं :) –

+0

+1: बिल्कुल शानदार। –

+0

मनोरंजक, लेकिन असली जवाब की तलाश करते समय रास्ते में आता है। – finnw

0

सवाल यह है: autorelease या release का उपयोग किसी ऑब्जेक्ट के जीवनकाल को कैसे प्रभावित करता है?

आपके दोनों उदाहरणों में इससे कोई फर्क नहीं पड़ता।

दोनों NSFetchRequest और NSSortDescriptors वे जारी या autoreleased रहे हैं कि क्या की परवाह किए बिना विधि के अंत तक जीवित हो जाएगा।

आप एक वस्तु का एक उदाहरण बना सकते हैं और फिर एक और वस्तु (जैसे कि, एक NSArray) को दे रहे हैं, तो इसके बारे में है कि क्या आप रिहाई या autorelease फोन परवाह किए बिना जीवित रहेगा।

-1

दोनों को बनाए रखने और autorelease, कार्यात्मक एक वस्तु को बनाए रखने, लेकिन वे विलय नहीं है। मतभेद यह है कि बनाए रखने की गणना केवल किसी अन्य वस्तु द्वारा घटित की जा सकती है जबकि एनएसएयूटोरिलीपूल को निकालने पर ऑटोरेलेज्ड गणना स्वचालित रूप से घट जाती है। यदि पूल नाली के समय तक किसी अन्य वस्तु ने ऑटोरेलेज्ड ऑब्जेक्ट को बरकरार रखा है, तो यह पोफ जाता है।

असल में, आप ऑटोरेलीज का उपयोग करते हैं जब आप यह सुनिश्चित करना चाहते हैं कि कोई ऑब्जेक्ट वर्तमान विधि में चारों ओर लटकता है और अन्य ऑब्जेक्ट्स को पास किया जा सकता है लेकिन आप इसे अपने रिलीज़ को ट्रैक नहीं करना चाहते हैं।

आपके उदाहरण कोड में, ऑटोरेलीज केवल एक सुरक्षा उपाय है। NSPredicate ऑब्जेक्ट जारी किया गया है क्योंकि इसकी नौकरी समाप्त हो गई है लेकिन कोडर यह सुनिश्चित करना चाहता था कि NSFetchRequest ऑब्जेक्ट चारों ओर लटका हुआ हो। इस उदाहरण में आपको "autorelease" का उपयोग करने की आवश्यकता नहीं है, लेकिन अगर आप अपनी रिलीज की गिनती खो देते हैं तो fetchRequest गायब हो सकता है।दूसरी तरफ, आप इसे अनाथ और लीक नहीं करना चाहते हैं ताकि ऑब्जेक्ट पूल को निकालने पर साफ करने के लिए आप ऑटोरेलीज का उपयोग करें।

ऑटोरेलीज का सबसे आम उपयोग तब होता है जब आप प्रत्येक बार ऑब्जेक्ट्स की एक चर संख्या बना रहे हैं। आप उन सभी को ट्रैक नहीं करना चाहते हैं ताकि आप उन्हें ऑटोरेलीज़ कर सकें और पूल को उनकी देखभाल कर सकें। (इससे भी बेहतर, आप एक स्थानीय पूल बनाते हैं और जैसे ही आप इसे पूरा करते हैं।)

ऐप्पल एपीआई मानक में, कोई भी विधि जो कुंजी शब्द 'init', 'new' या 'create' के बिना एक नई वस्तु बनाता है 'एक ऑटोरेलेज्ड ऑब्जेक्ट देता है।

-[NSString initWithString:] autorelease नहीं है लेकिन - [NSString stringWithString:] है। इससे गैर-कचरा संग्रहण वातावरण में समस्याएं आती हैं क्योंकि stringWithString: एक स्ट्रिंग देता है जो एक बनाए गए ऑब्जेक्ट की तरह व्यवहार करता प्रतीत होता है लेकिन बाद में यह अचानक यादृच्छिक रूप से गायब हो जाता है जब ऑटोरेलीज पूल इसे नालियों में बनाया गया था।


Edit01: से एप्पल डॉक्स

एक autorelease पूल NSAutoreleasePool का एक उदाहरण है कि "शामिल है" अन्य वस्तुओं है कि एक autorelease संदेश प्राप्त हुआ है है; जब ऑटोरेलीज पूल को हटा दिया गया है तो इसे उन ऑब्जेक्ट्स में से प्रत्येक को रिलीज़ संदेश भेजता है। एक ऑब्जेक्ट को एक ऑटोरेलीज पूल में कई बार डाल दिया जा सकता है, और प्रत्येक बार इसे पूल में डाला जाने के लिए रिलीज संदेश प्राप्त होता है। इस प्रकार, एक वस्तु को autorelease बजाय की रिहाई भेजने पूल ही जारी किया (वस्तु लंबे समय तक जीवित हो सकता है अगर यह अंतरिम में बनाए रखा है) है जब तक कम से कम उस वस्तु की जीवन फैली हुई है।

बरकरार गणना और autorelease दोनों एक ही मूल (लेकिन अलग) गिनती तंत्र द्वारा जीवित वस्तु को जीवित रखते हैं। मुख्य अंतर यह है कि स्वामित्व वाली वस्तु रिलीज भेजती है। बनाए रखा गिनती के साथ, इसकी दूसरी वस्तु लेकिन एक ऑटोरेलेज्ड के लिए ऑटोरलीज पूल की गणना करता है।

+0

autorelease किसी ऑब्जेक्ट को बनाए रखता नहीं है। –

+0

मैंने स्पष्ट किया, क्या यह बेहतर है? – TechZen

1

अनुरोध वस्तु कॉलर को वापस करने जा रही है, जबकि सॉर्ट डिस्क्रिप्टर का उपयोग किया जा रहा है और फिर त्याग दिया गया है।

autorelease के लिए तर्क सरल है। इसके बिना, किसी फ़ंक्शन से लौटाई गई किसी ऑब्जेक्ट को कॉलर द्वारा रिलीज़ करने की आवश्यकता होगी यदि उन्हें इसकी आवश्यकता नहीं है। ऑटोरेलीज़ का उपयोग करना मतलब है कि फ़ंक्शंस एक ऑब्जेक्ट वापस कर सकता है, यदि कॉलर की परवाह नहीं है, या यदि वे इसे देखने जा रहे हैं लेकिन इसका संदर्भ नहीं रखते हैं, तो वे इसे मुक्त करने के लिए अतिरिक्त कोड जोड़ने के बिना इसका उपयोग कर सकते हैं। केवल अगर वे संदर्भ रखते हैं तो उन्हें इसे बनाए रखने की आवश्यकता है।

यह बिल्कुल सही है कि ऑटोरेलीज का अर्थ क्या है। जब आप किसी ऑब्जेक्ट पर ऑटोरेलीज़ को कॉल करते हैं, तो यह ऑब्जेक्ट को एक सूची में जोड़ता है, और जब आपका एप्लिकेशन लूप समाप्त होता है, तो उसे रिलीज़ किया जाएगा। यह स्वचालित रूप से देरी से रिलीज के बराबर autorelease बनाता है।

स्मृति प्रबंधन पर सेब दस्तावेज़ उत्कृष्ट और सावधानीपूर्वक पढ़ने योग्य है। http://developer.apple.com/iPhone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

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