NSZombie क्या है?


97

मैंने सुझाव दिया है कि डिबगिंग करते समय सेट NSZombieEnabledकरने के लिए सुझाव दें true। NSZombie क्या है? क्या यह एक ढांचा है? एक सेटिंग?


18
एक मरे हुए NSObject - खबरदार!
वाइकिंगोजगुंडो

5
एक * पूर्वव्यापी NSObject।
एलेक्स ज़ावाटोन

जवाबों:


192

यह एक मेमोरी डिबगिंग सहायता है। विशेष रूप से, जब आप सेट करते हैं NSZombieEnabledतब जब भी कोई वस्तु गिनती 0 को बनाए रखती है, बजाय इसके कि उसे NSZombieउदाहरण में रूपांतरित किया जाए । जब भी इस तरह के एक ज़ोंबी संदेश प्राप्त होता है, तो यह दुर्घटनाग्रस्त होने या अप्रत्याशित तरीके से व्यवहार करने के बजाय चेतावनी देता है। इस प्रकार, आप हाइस्टैक खोजों के बिना उन्नत टूल या श्रमसाध्य सुई के बिना सूक्ष्म ओवर-रिलीज़ / ऑटोरेलिज़ समस्याओं को डीबग कर सकते हैं।

नाम इस तथ्य पर एक स्पष्ट रूप से स्पष्ट खेल है कि वस्तुओं को "मृत" माना जाता है जब वे बनाए रखने की गिनती तक पहुंचते हैं 0. इस सेटिंग के साथ, वे एक अजीब अर्ध-जीवन में मौजूद हैं - न तो जीवित, न ही काफी मृत। असली लाश को बहुत पसंद करते हैं, सिवाय इसके कि वे कम दिमाग खाते हैं।


61
डिबगिंग करते समय इस सेटिंग को हटाने के लिए सावधान रहें क्योंकि यह अनिवार्य रूप से हर ऑब्जेक्ट को लीक करता है।
जस्टिन

1
इस सरल व्याख्या के लिए धन्यवाद। बता दें कि कोको देव लिंक अब और काम नहीं कर रहा है। +1 छोटी और बात के लिए।
CRDave

95

एडम ने यह बताने में बहुत अच्छा काम किया कि लाश क्या हैं, लेकिन पर्यावरण चर का उपयोग करना इनको खोजने और ट्रैक करने का सबसे अच्छा तरीका नहीं है।

ज़ोंबी का पता लगाने के लिए एक बेहतर तरीका, साधन का उपयोग करना है - XCode से "इंस्ट्रूमेंट रन के साथ" शुरू करें और "आवंटन" चुनें।

फिर रिकॉर्डिंग शुरू होने के ठीक बाद बंद कर दें, एलोकेशन इंस्ट्रूमेंट पर "i" बटन दबाएं, और "रेफरेंस कॉन्टेक्ट काउंट्स" और "एनसजॉम्बी डिटेक्शन सक्षम करें" को ऑन करें। अब इंस्ट्रूमेंट में फिर से रिकॉर्ड हिट करें, और आपका ऐप शुरू हो जाएगा - यदि कोई ज़ोंबी ऑब्जेक्ट भेजे गए संदेश रिकॉर्डिंग बंद हो जाएगी, और रिकॉर्डिंग टाइमलाइन में एक डायलॉग बॉक्स पॉप-अप हो जाएगा - आप उस जगह पर क्लिक कर सकते हैं जो हर जगह को खोजने के लिए एक ऑब्जेक्ट था बरकरार या जारी रखा गया।

संपादित करें: पिछली सलाह XCode 3 के लिए थी, यहाँ XCode 4 के लिए एक अतिरिक्त है:

XCode 4.2 में , ज़ोंबी इंस्ट्रूमेंट - ज़ोंबी इंस्ट्रूमेंट का उपयोग करने के लिए एक और भी आसान तंत्र है। ऐप को शुरू करने के लिए "रन" के बजाय, "प्रोफ़ाइल" का उपयोग करें और एक साधन चयनकर्ता सामने आएगा। "ज़ोंबी" का चयन करें, और ऐप चलना शुरू हो जाएगा - जो भी आपके क्रैश का कारण बनता है, एक संवाद "ज़ोंबी संदेश" कहकर पॉप जाएगा।

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


2
यह अविश्वसनीय रूप से उपयोगी सलाह है।
w'donahue

4
मैंने XCode 4 के लिए उत्तर को अपडेट किया क्योंकि यह इंस्ट्रूमेंट्स में ज़ोंबी डिटेक्शन करना और भी आसान बनाता है।
केंडल हेल्मसटेटर गेलनर

वास्तव में नहीं,
एक्सकोड

2
मैं यह भी पुष्टि कर सकता हूं कि XCode 7.2 के
बीट

31

मैं मानता हूं कि केंडल ने क्या जोड़ा, यह बहुत उपयोगी है, लेकिन मैं अभी भी पर्यावरण चर करने का सुझाव दूंगा ताकि आप भूल न जाएं कि वे सक्षम हैं। कोको देव में (अब समाप्त हो गई) लिंक के समान, मैंने इसे डाल दिया ताकि मैं इसे याद न करूँ:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) {
    NSLog(@"ZOMBIES/AFOC ARE ENABLED!!! AAAAARRRRRRGH!!! BRAINS!!!");
} 

यह मेरा ध्यान बहुत अच्छी तरह से पकड़ता है।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.