2009-02-25 18 views
5

पर एक गिनती गिनती है, मेरे पास एक UIViewController है, जिस पर मैं इसे तुरंत चालू करता हूं 3 को बनाए रखता हूं। यह मुझे बहुत गलत के रूप में stirs। यह जानने का सबसे अच्छा तरीका क्या है कि किसने बरकरार रखा है? मैं कल्पना करता हूं कि ऑब्जेक्ट को तुरंत पॉइंटर 1 देना चाहिए, तो मुझे लगता है कि इसे यूएनएविगेशन कंट्रोलर के ढेर पर धक्का दे सकता है, इसे एक को टक्कर दे सकता है (हालांकि इसके बारे में निश्चित नहीं है?), लेकिन तीसरा .. एक रहस्य है।यह पता लगाने के लिए कि किसी ऑब्जेक्ट को

उत्तर

20

कभी भी बनाए रखने की गणना पर भरोसा न करें। क्या हुआ है कि प्रारंभिक प्रक्रिया के दौरान, कोड के कुछ टुकड़े retain एड और autorelease डी ऑब्जेक्ट में हैं। क्योंकि आप यह नहीं बता सकते कि ऑब्जेक्ट कितनी बार autorelease डी रहा है, आपको वास्तव में पता नहीं है कि वास्तविक गिनती बरकरार है।

रखें मायने रखता है केवल एक डिबगिंग सहायता के रूप में इस्तेमाल किया जाना चाहिए, कभी नहीं कार्यक्रम नियंत्रण प्रवाह के रूप में

जब तक आप Memory Management Programming Guide for Cocoa में निर्धारित सभी नियमों का पालन करते हैं, तो आपको कोई समस्या नहीं होगी।

8

यह जानने का सबसे अच्छा तरीका क्या है कि किसने बरकरार रखा है?

यह गलत कोण से समस्या का सामना कर रहा है। यह आपको भ्रमित करेगा और आपको वास्तव में एक वास्तविक समस्या होने पर वास्तविक समस्या (और शायद सही अतीत) का नेतृत्व करेगा।

के बारे में सोचने के लिए बेहतर है जो ऑब्जेक्ट ऑब्जेक्ट का मालिक है। क्या आप ऑब्जेक्ट को अपने गुणों में से किसी एक के मूल्य के रूप में रखने का इरादा रखते हैं? यदि ऐसा है, तो आप इसके मालिकों में से एक हैं। यदि नहीं, तो आप नहीं हैं। यदि आप ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट में अपनी किसी एक प्रॉपर्टी में स्टोर करने के लिए पास करते हैं, तो वह अन्य ऑब्जेक्ट भी एक मालिक है।

ये स्वामित्व सिर्फ रिश्ते हैं, इसलिए उन्हें सीधे अपने सिर में रखना आसान है।

  • "यह मेरे नियंत्रकों में से एक है। यह मेरे मॉडल की मूल वस्तुओं और एक या अधिक दृश्य [नियंत्रक] का मालिक है। "
  • " यह एक दृश्य है। यह मेरे मॉडल के कुछ हिस्सों का मालिक है। "
  • " यह मेरे मॉडल का हिस्सा है। यह केवल आदिम वस्तुओं का मालिक है। "
  • " यह मेरे मॉडल का एक और हिस्सा है। यह कुछ आदिम वस्तुओं और मॉडल के कुछ अन्य बिट्स

, तो मालिक है। "यदि आप अपने स्वामित्व का एक ठोस समझ है, तो आप नहीं एक release या autorelease संदेश (जो भी हो सकता है भूल जाने के अलावा एक स्मृति रिसाव लिख सकते हैं किसी के लिए), और आप जानबूझकर और अत्यधिक टिप्पणियों और # चेतावनियों को छोड़कर निश्चित रूप से चक्रीय प्रतिधारण (दो वस्तुओं को एक दूसरे को बनाए रखने) नहीं लिखेंगे।

यदि आपने अपने स्वामित्व का काम नहीं किया है, तो संभवतः आपने शायद एक या अधिक मेमोरी लीक या चक्रीय प्रतिधारण लिखे हैं जिन्हें आप नहीं जानते हैं।


संपादित करें: और वास्तविक सवाल है, क्या अपने पास रखा और है, संभवतः यह पता लगाने का सबसे अच्छा तरीका है, बाद में जवाब देने के लिए autoreleased-एक वस्तु को उपकरण का आवंटन साधन का उपयोग करें। इसके साथ, आप किसी भी ऑब्जेक्ट का इतिहास देख सकते हैं ताकि प्रत्येक आवंटन, रखरखाव, ऑटोरेलीज, रिहाई और उसके पते को रद्द कर सकें।

43

एडम सही है कि आपको बनाए रखने के बारे में अत्यधिक चिंतित नहीं होना चाहिए।

लेकिन यदि आपके पास कभी भी इस तरह के रहस्य को हल करने की वैध आवश्यकता है, तो एक अच्छी तकनीक प्रभावित वर्ग को उप-वर्ग करना है ताकि आप मेमोरी-प्रबंधन विधियों में ओवरराइड जोड़ सकें।

उदा। UIViewController का एक उपवर्ग में, आप लागू कर सकते हैं:

- (id) retain 
{ 
    // Break here to see who is retaining me. 
    return [super retain]; 
} 
+0

आप कैसे देख सकते हैं जो वस्तु को बनाए रखना है? एकमात्र तर्क स्वयं है, है ना? – quano

+5

क्वानो - आप डीबगर से स्टैक ट्रेस को देखते हैं। आप देखेंगे कि कौन कॉल कर रहा है। – danielpunkass

+0

महान विचार। धन्यवाद! – mtrc

1

यह एक 100% समाधान नहीं है, लेकिन LLVM बजना स्टेटिक विश्लेषक गलत स्मृति प्रबंधन को उपयोग पर नज़र रखने में एक बड़ी मदद हो सकती है। स्टेटिक विश्लेषक और मॉलोकडेबग के बीच, आप स्मृति प्रबंधन समस्याओं को बहुत जल्दी ट्रैक करने में समर्थक बन सकते हैं। बीटीडब्लू, भले ही इंस्ट्रूमेंट्स नई गर्मी है, मुझे मॉलोकडेबग अधिक विश्वसनीय लगता है।

आप LLVM बजना स्टेटिक विश्लेषक यहाँ पा सकते हैं: LLVM/Clang Static Analyzer

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