ViewController का जवाब


95

ठीक है, यहाँ सौदा है, मुझे अपने डीबगिंग और क्रैश के बारे में सवाल डालने से नफरत है। क्योंकि मैं आमतौर पर उन्हें अपने आप को संभालता हूं, लेकिन मैं पहले से ही कई सवालों को देखने के बाद भी इस पर अपना रास्ता नहीं बना सकता ।

ठीक है, तो यहाँ समस्या है, मैं इस स्टैक ट्रेस के साथ अपने ऐप को अनियमित रूप से ऑन और ऑफ कर रहा हूं:

*** -[ViewController respondsToSelector:]: message sent to deallocated instance 0x1e5d2ef0

जहां ViewControllerभिन्न हो सकते हैं, कभी-कभी जिस स्थान पर मेरा कोड क्रैश होता है, उस विशेष के लिए कोई प्रासंगिकता नहीं होती है ViewControllerऔर इसे स्वयं या कॉल नहीं करता है।

इसके अलावा, उस कंसोल ट्रेस को प्राप्त करने के लिए, मैंने लाश को सक्षम किया है, अन्यथा मुझे कोई कंसोल प्रिंट नहीं मिलेगा, मुझे केवल यही मिलेगा: objc_msgSendजो मुझे पता है कि मैं कुछ संदेश जारी कर रहा हूं। लेकिन मुझे नहीं पता कि वह कहाँ है ... मैं वास्तव में फंस गया हूँ! आमतौर पर मैं हमेशा अपने क्रैश को डिबग करता हूं, इसलिए मैं वास्तव में इस पर अटक गया हूं।

फिर, यह अलग-अलग स्थानों पर अलग-अलग समय में, चालू और बंद होता है। और जिस स्थान पर यह दुर्घटनाग्रस्त हुई है उसकी कोई प्रासंगिकता नहीं है ViewController। और मुझे यह बहुत भ्रामक लगता है।

क्या आपको मेरे किसी कोड की आवश्यकता है? मेरे पास बहुत सी फाइलें हैं और चूंकि यह अलग-अलग जगहों पर दुर्घटनाग्रस्त हो रही है, इसलिए मेरा कोड वितरित करना एक गड़बड़ होगा!

मैंने बिना किसी भाग्य के प्रतीकात्मक विराम बिंदुओं को जोड़ने की कोशिश की है, और iOS के लिए इंस्ट्रूमेंट्स एप्लिकेशन पर लाश उपलब्ध नहीं है। मैं अपना ऐप सिम्युलेटर पर नहीं चला सकता क्योंकि इसमें इसके लिए असमर्थित आर्किटेक्चर फ्रेमवर्क है।

सबको धन्यवाद...


क्या आपने इस प्रश्न को देखा: stackoverflow.com/questions/1585688/…
आत्म

यह मानते हुए कि आपके विचारों में परिवर्तन का तरीका सुसंगत है, शायद आप हमें एक उदाहरण या दो दिखा सकते हैं। यदि आप स्टैण्डर्ड पुश / प्रेजेंटव्यूकंट्रोलर कॉल कर रहे हैं तो आपको ठीक होना चाहिए, लेकिन मैं यहाँ बहुत से लोगों को व्यू कंट्रोलर को आवंटित / इनिट करने जैसी चीजें करता हूँ, लेकिन फिर एक पुश / प्रेजेंट नहीं कर रहा हूँ, बल्कि सिर्फ कंट्रोलर को जोड़ रहा हूँ सबव्यू के रूप में देखें। बस एक यादृच्छिक उदाहरण है। लेकिन हम कुछ कोड के बिना इसका निदान नहीं कर सकते। उम्मीद है कि कुछ स्निपेट्स हमें यह पता लगाने में मदद करेंगे कि क्या चल रहा है, तो चलिए देखते हैं।
रोब

प्रतीकात्मक विराम बिंदु को सक्षम करने के बारे में कैसे? इन्हें जोड़ने का प्रयास करें: wiki.zemingo.com/index.php?title=Symbolic_Breakpoints
Stavash

@RobertRyan मैं वर्तमानमॉडल व्यू कॉन्ट्रोलर का उपयोग करता हूं, मैं इसे
सबव्यू के

मेरे मामले में, मेरे चाइल्ड व्यू कंट्रोलर में एक वेब व्यू था, और चाइल्ड वीसी, वेब व्यू के स्क्रॉल व्यू का प्रतिनिधि था। मुझे डीललॉक / व्यूवेलडिसपियर के दौरान प्रतिनिधि संदर्भ को मैन्युअल रूप से हटाने की आवश्यकता है या मुझे यह क्रैश मिला है। आशा है कि यह किसी की मदद करता है।
डर्मोट

जवाबों:


169

डीलक्लॉक किए गए इंस्टेंस त्रुटियों को ट्रैक करने के लिए इंस्ट्रूमेंट्स का उपयोग करें । अपने एप्लिकेशन ( Cmd ⌘+ I) को प्रोफाइल करें और लाश टेम्पलेट चुनें। आपका एप्लिकेशन चलने के बाद, उसे क्रैश करने का प्रयास करें। आपको कुछ ऐसा मिलना चाहिए:

यहां छवि विवरण दर्ज करें

पॉप-अप में पता करने के लिए तीर पर क्लिक करें, जिस वस्तु को दिखाने के बाद उसे कॉल किया गया था।

यहां छवि विवरण दर्ज करें

अब आपको हर उस कॉल को देखना चाहिए जिसने इस ऑब्जेक्ट की रिटेन काउंट को बदल दिया है। ऐसा इसलिए हो सकता है क्योंकि ऑटोरेलेज पूलों को हटाने या NSArrays में डालने के साथ-साथ सीधे अनुरक्षण / रिलीज संदेश भेजना।

RefCt कॉलम एक्शन को लागू करने के बाद और फिर से प्रदर्शित करता है जिम्मेदार कॉलर क्लास का नाम और विधि दिखाता है जिसमें यह प्रदर्शन किया गया था। जब आप किसी भी अनुरक्षण / रिलीज पर डबल क्लिक करते हैं, तो उपकरण आपको उस कोड की पंक्ति दिखाएगा जहां यह प्रदर्शन किया गया था (यदि यह काम नहीं कर रहा है, तो आप कॉल का चयन करके इसे विस्तारित विस्तार फलक में इसके समकक्ष का चयन करके देख सकते हैं ):

यहां छवि विवरण दर्ज करें

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


3
समस्या releaseविशेष रूप से नवीनतम नहीं हो सकती है । समस्या कोई भी असंतुलित है release। मैं भी बस एक retainचीज के लिए असफल हो सकता हूं जिसे आप एक पॉइंटर रख रहे हैं और बाद में संदर्भित कर रहे हैं।
केन थॉम्सिस

1
इसके अलावा, मेरे पास एक ज़ोंबी इंस्ट्रूमेंट टेम्पलेट नहीं है, ऐसा इसलिए हो सकता है क्योंकि मैं
एक्सकोड

2
ओह, लाश केवल आईओएस सिम्युलेटर में प्रदान की जाती है। मैं iOS सिम्युलेटर में नहीं चल सकता, मेरे कुछ फ्रेमवर्क और लाइब्रेरियों का इस्तेमाल आर्किटेक्चर का समर्थन नहीं करता है
MCKapur

बस एक छोटा सा नोट। यह xcode 5 में नया क्या है, "Xcode 5 में लाश साधन टेम्पलेट को बढ़ाया गया है और अब उपकरणों पर उपयोग का समर्थन करता है। उपकरणों पर लाश का उपयोग करना iOS 7 की आवश्यकता है।" यह नोट मेरे और मेरे कीमती समय के 2 घंटे आपके लिए लाया है ...
10

2
जब हम इस उपकरण को हुक करते हैं, तो हमारा ऐप क्रैश हो जाता है और "डीलक्लॉक्स्ड इंस्टेंस पर भेजा गया संदेश" त्रुटि देना बंद कर देता है तो इसका क्या मतलब है? (यह ऐसा है जैसे कि "रोग" गायब हो जाता है जब रोगी को "नैदानिक ​​परीक्षण" दिया जाता है।)
प्रैक्सिटेलिस

59

इसी तरह की समस्या थी। मेरे मामले में नेवीगेशन कंट्रोलर घटनाओं को प्राप्त करने के लिए एक व्यू कंट्रोलर की जरूरत है, इसलिए यह नेविगेशन कंट्रोलर प्रतिनिधि के रूप में पंजीकृत हो रहा था:

 self.navigationController.delegate = self;

क्रैश तब होता है जब उस नियंत्रक को हटा दिया गया था, लेकिन फिर भी दृश्य नियंत्रक के लिए प्रतिनिधि था। डीललोक में इस कोड को जोड़ने का कोई प्रभाव नहीं पड़ा:

-(void) dealloc
{
    if (self.navigationController.delegate == self)
    {
        self.navigationController.delegate = nil;
    }

क्योंकि जिस बिंदु पर डीललॉक कहा जाता है, उस दृश्य नियंत्रक को पहले ही दृश्य पदानुक्रम से हटा दिया गया है, इसलिए self.navigationController शून्य है, इसलिए तुलना विफल होने की गारंटी है! :-(

समाधान वास्तव में ऐसा करने से पहले दृश्य पदानुक्रम को छोड़कर कुलपति का पता लगाने के लिए इस कोड को जोड़ना था। यह आईओएस 5 में शुरू की गई विधि का उपयोग करता है यह निर्धारित करने के लिए कि दृश्य को पॉप किया जा रहा है और धक्का नहीं दिया गया है

-(void) viewWillDisappear:(BOOL) animated
{  
   [super viewWillDisappear:animated];
   if ([self isMovingFromParentViewController])
   {
      if (self.navigationController.delegate == self)
      {
           self.navigationController.delegate = nil;
      }
   }
}

कोई और अधिक दुर्घटनाओं!


मुझे भी धन्यवाद - इस पोस्ट को खोजने के लिए केवल 4 घंटे की खोज की आवश्यकता है।
daiai

पोस्टिंग के लिए धन्यवाद, एक ही समस्या थी ^ ^
टायरोन

आप लोग इस तरह के परेशान करने वाले मुद्दों का समाधान कैसे खोजते हैं? सलाम !!
वीरूमैक्स

4

जो लोग इसे हल नहीं कर सकते हैं, उनके लिए यहां कुछ अन्य तकनीकें हैं:

https://stackoverflow.com/a/12264647/539149

https://stackoverflow.com/a/5698635/539149

https://stackoverflow.com/a/9359792/539149

https://stackoverflow.com/a/15270549/539149

https://stackoverflow.com/a/12098735/539149

आप प्रोजेक्ट पॉपअप पर क्लिक करके इंस्ट्रूमेंट्स को Xcode 5 में चला सकते हैं-> एडिट स्कीम ... प्रोफाइल -> इंस्ट्रूमेंट को चुनें और अलोकेशन या लीक्स चुनें, फिर अपने ऐप को प्रोफाइल करें, फिर इंस्ट्रूमेंट्स को बंद करें, ऑलोकेशन में इंफॉर्मेशन बटन पर क्लिक करें और "NSZombie Detection को इनेबल करें" पर क्लिक करें। ।

हालाँकि, सीधे com.apple.main- थ्रेड से आने वाले संदेशों के लिए, यह संभवतः कुछ भी प्रकट नहीं करेगा।

मैंने दो घंटे के लिए इस पर अपना सिर पीटा और जवाब एक अति-रिलीज के रूप में निकला, जिसे मैंने अपनी परियोजना की एक प्रति को बलपूर्वक तब तक टिप्पणी की जब तक कि मुझे दोषी नहीं पाया गया:

[viewController release];
viewController = NULL;

समस्या यह है कि रिलीज़ NULL को वैरिएबल सेट नहीं करता है।

इसका मतलब यह है कि इसे NULL कॉल रिलीज करने के लिए फिर से सेट करना, रीक्राउंट को कम करना और मेमोरी को तुरंत बाद में तब तक फ्री करना जब संदर्भ व्यू कॉन्ट्रोलर वाले वैरिएबल इसके साथ समाप्त हो जाते हैं।

इसलिए या तो ARC सक्षम करें या सुनिश्चित करें कि आपकी परियोजना लगातार रिलीज़ या NULL का उपयोग करती है लेकिन दोनों नहीं। मेरी प्राथमिकता NULL का उपयोग करना है क्योंकि तब एक ज़ोंबी को संदर्भित करने का कोई मौका नहीं है, लेकिन यह पता लगाता है कि ऑब्जेक्ट्स को कहाँ और अधिक कठिन जारी किया जाता है।


4

मैं कल आईओएस में इसी समस्या से मिला था। मैंने ऐप के बारे में "सब" में IAP बनाया है, और मैंने "About" viewDidLoad में Transaction Observer जोड़ा है। जब मैं पहली बार खरीदारी करता हूं, तो कोई समस्या नहीं है, लेकिन जब मैं मुख्य विंडो पर वापस जाता हूं और फिर से खरीद करने के लिए सबवू के बारे में दर्ज करता हूं, तो समस्या "डीलक्लॉस्ड उदाहरण के लिए भेजा गया संदेश" हुआ, और ऐप क्रैश हो गया।

- (void)viewDidLoad
{
    [[SKPaymentQueue defaultQueue] addTransactionObserver:self];                                           object:nil];
}

डीलक्लॉक में ट्रांजेक्शन ऑब्जर्वर को हटाने के बाद, समस्या हल हो गई है।

- (void)dealloc
{
    // Even though we are using ARC, we still need to manually stop observing any
    // NSNotificationCenter notifications.  Otherwise we could get "zombie" crashes when
    // NSNotificationCenter tries to notify us after our -dealloc finished.

    [[SKPaymentQueue defaultQueue] removeTransactionObserver:self];
}

इसने मेरे रनटाइम क्रैश को ठीक कर दिया ... मुझे zombieinApp खरीद के लिए वस्तु मिल रही थी । खुदाई के कई घंटों के बाद मुझे यह मिल गया .... एक बड़ा आदमी।
महेंद्र

4

मेरे पास एक समान मुद्दा था और मुझे लगा कि यह नेविगेशन नियंत्रक प्रतिनिधियों के सेट के कारण है।

नीचे मेरी समस्या हल हो गई,

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    if (self.navigationController.delegate != self) {
        self.navigationController.delegate = self;
    }
}

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    if (self.navigationController.delegate == self) {
        self.navigationController.delegate = nil;
    }
}

धन्यवाद!! यहाँ भी यही समस्या थी।
Pegpeg

2

OS X में भी यही समस्या थी।

इसे हल करने के लिए - (void)dealloc@SoftwareEvolved के रूप में पहले से ही पर्याप्त विधि नहीं है । लेकिन दुर्भाग्य - (void)viewWillDisappearसे केवल 10.10 और बाद के संस्करण में उपलब्ध है।

मैंने अपने NSViewController उपवर्ग में कस्टम विधि की शुरुआत की, जिसमें शून्य से सभी ज़ोंबी-खतरनाक संदर्भ सेट किए गए थे। मेरे मामले में वह NSTableViewगुण ( delegateऔर dataSource) था।

- (void)shutdown
{
  self.tableView.delegate = nil;
  self.tableView.dataSource = nil;
}

बस इतना ही। हर बार जब मैं देख रहा हूँ तो मुझे इस पद्धति को कॉल करने की आवश्यकता होगी।


2

मुझे एक ही समस्या थी। यह पता लगाना मुश्किल था कि कौन सा प्रतिनिधि कारण जारी करता है, क्योंकि यह किसी भी लाइन या कोड स्टेटमेंट को इंगित नहीं करता है इसलिए मैंने कुछ तरीका आजमाया है, हो सकता है कि यह आपके लिए उपयोगी हो।

  1. Xib फ़ाइल खोलें और फ़ाइल के स्वामी से, "कनेक्शन इंस्पेक्टर" राइट हैंड साइड मेनू चुनें। प्रतिनिधि सूचीबद्ध हैं, उन्हें शून्य करने के लिए सेट करें जो संदिग्ध हैं।
  2. (मेरे मामले के रूप में भी) टेक्स्टफील्ड की तरह संपत्ति वस्तु मुद्दा बना सकती है, इसलिए अपने प्रतिनिधियों को शून्य पर सेट करें।
-(void) viewWillDisappear:(BOOL) animated{

[super viewWillDisappear:animated];

if ([self isMovingFromParentViewController]){

self.countryTextField.delegate = nil;

self.stateTextField.delegate = nil;

}

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