2011-10-18 12 views
7

मैं LLVM साइट पर एआरसी डॉक्स पढ़ रहा था: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool@autoreleasepool अर्थ विज्ञान

@autoreleasepool के बारे में विशेष रूप से ..in।

NSAutoreleasePool का उपयोग करके वर्तमान कार्यान्वयन में, मैं उन मामलों को देखता हूं जहां पूल लूप पुनरावृत्ति के दौरान समय-समय पर निकाला जाता है - हम @autorelease पूल के साथ ऐसा कैसे करते हैं, या यह सब हमारे लिए हुड के तहत किया गया है?

दूसरा, दस्तावेज़ बताते हैं कि यदि कोई अपवाद फेंक दिया जाता है, तो पूल निकाला नहीं जाता है .... ठीक अपवाद असाधारण नाम से हैं, लेकिन यदि वे ऐसा करते हैं, तो आप स्मृति की एक भार को लीक किए बिना पुनर्प्राप्त करना चाहेंगे । जब दस्तावेज़ों को जारी किया जाएगा तो दस्तावेज़ निर्दिष्ट नहीं करते हैं।

किसी को भी इन बिंदुओं के बारे में कोई जानकारी मिली है?

उत्तर

9

वर्तमान कार्यान्वयन के बहुत में NSAutoreleasePool का उपयोग कर, मैं ऐसे मामलों में जहां पूल एक पाश यात्रा के दौरान समय-समय पर बहा दिया जाता है देखते हैं - हम कैसे @autorelease पूल के साथ भी ऐसा ही करते हैं, या यह सब हुड के नीचे किसी भी तरह हमारे लिए किया है ?

इसी तरह, यानी, ऑटोरेलीज पूल को कैस्केड करके। उदाहरण के लिए:

@autoreleasepool { 
    … 
    for (int i = 0; i < MAX; i++) { 
     @autoreleasepool { 
      … 
     } 
    } 
    … 
} 

दूसरे, डॉक्स राज्य है कि अगर एक अपवाद फेंक दिया जाता है, पूल सूखा नहीं है .... ठीक अपवाद असाधारण नाम से कर रहे हैं, लेकिन अगर वे ऐसा करते हैं, आपको पसंद आ सकते स्मृति का भार लीक किए बिना ठीक होने के लिए। जब दस्तावेज़ों को जारी किया जाएगा तो दस्तावेज़ निर्दिष्ट नहीं करते हैं।

ज्यादातर मामलों में कार्यक्रम कोको में अपवादों की अनोखी प्रकृति के कारण कृपा से ठीक नहीं हो पाएगा, इसलिए मैं कहूंगा कि लीकिंग ऑब्जेक्ट्स कम समस्या है। यदि @autoreleasepool ब्लॉक अपवाद के कारण बाहर निकला है, तो संबंधित ऑटोरेलीज्ड ऑब्जेक्ट केवल तभी रिलीज़ हो जाएंगे जब संलग्न ऑटोरेलीज पूल में से एक पॉप हो जाए। लेकिन, आप इसे होने से रोकने के लिए @autoreleasepool ब्लॉक के अंदर @try/@catch/@finally ब्लॉक रख सकते हैं।

+0

मुझे लगता है कि आपके उत्तर का दूसरा भाग बिल्कुल सही नहीं है। ऑटोरेलीज पूल स्वचालित रूप से ऑटोरेलीज पूल में स्वचालित रूप से स्वत: बंद हो जाते हैं जो आवंटित किए जाने पर प्रभावी थे। जब तक अपवाद बाहरीतम ऑटोरेलीज पूल से आगे नहीं फैलता है, तब तक कोई ऑटोरेलेज्ड ऑब्जेक्ट रिसाव नहीं होगा। – JeremyP

+0

@ जेर आप सही हैं; चेतावनी के लिए धन्यवाद! –

+0

@Bavarious - महान महान उत्तर के लिए धन्यवाद। यह निश्चित रूप से है, यह 'stringWithFormat' का उपयोग करते समय लूप में स्मृति को रिसाव करता है। –

2

कैसे हम @autorelease पूल

इस तरह

साथ भी ऐसा ही करते हैं:

for (int i = 0; i < 10000; i++) { 
    @autoreleasepool { 
     // Do your work here 
     ... 
    } 
} 

दूसरे, डॉक्स राज्य है कि एक अपवाद फेंका जाता है, पूल 'isn टी सूखा .... ठीक अपवाद असाधारण नाम से हैं, लेकिन अगर वे ऐसा करते हैं, तो आप स्मृति की एक भार को लीक किए बिना ठीक करना चाहेंगे।

AFAIK यह एआरसी के साथ संभव नहीं है। एआरसी बिल्कुल अपवाद नहीं है। यदि कोई अपवाद होता है, तो गैर-पुनर्प्राप्ति योग्य स्मृति लीक की संभावना होती है। कोड जो एआरसी का उपयोग करता है, त्रुटि रिपोर्टिंग के लिए अपवादों पर भरोसा नहीं करना चाहिए। उम्मीद है कि अपवाद उठाए जाने पर प्रक्रिया किसी भी तरह दुर्घटनाग्रस्त हो जाती है।

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