10

मैं के रूप में तो मेरे TableViewController के didSelectRowAtIndexPath विधि के भीतर से मेरे नेविगेशन नियंत्रक के ढेर पर एक दृश्य नियंत्रक धक्का कर रहा हूँ:यह ओवर-रिलीज़ क्यों है? UINavigationController/UITableView

MyViewController *myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil]; 
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 
MyObject *myO = (MyObject *)[appDelegate.myOs objectAtIndex:indexPath.row]; 
myViewController.amount = myO.amount; 
[self.navigationController pushViewController:myViewController animated:YES]; 
[myViewController release]; 

अगर मैं एक त्रुटि के साथ वापसी पर अंतिम पंक्ति है कि तब ऐप्लिकेशन क्रैश uncomment:

-[CALayer release]: message sent to deallocated instance 0xd4f860 

कुछ ही देर में खुदाई आगे मैं दुर्घटना आगे [सुपर dealoc] करने के लिए कॉल MyViewController के dealoc विधि के भीतर तक ही सीमित हो कर सकते हैं। "[सुपर डीलोक]" को अपूर्ण करके हम दुर्घटनाग्रस्त नहीं होते हैं।

मुझे इसे और कम करने में समस्या आ रही है। "सुपर" UIViewController क्लास होगा और मैं उस डीलोक विधि की और जांच नहीं कर सकता ... क्या मैं कर सकता हूं? शायद यह देखने का एक तरीका है कि वास्तव में 0xd4f860 क्या इंगित कर रहा था लेकिन मुझे पता नहीं है कि कैसे? कोई विचार?

+0

क्या आप कहीं भी myViewController.view जारी कर रहे हैं? –

उत्तर

4

आप गलत जगह पर देख रहे हैं - समस्या यह है कि MyViewController को कई बार रिलीज़ किया जा रहा है (या ऑटोरेलेज्ड)।

आपके द्वारा पोस्ट किया गया कोड सही दिखता है, इसलिए मैं यह देखने के लिए MyViewController का कोड देखता हूं कि यह कभी भी रिलीज़ होता है, या किसी भी तरह से इसे अन्य माध्यमों से रिलीज़ किया जाता है।

आप रिलीज विधि को ओवरराइड भी कर सकते हैं, ब्रेक पॉइंट सेट कर सकते हैं और देख सकते हैं कि आप इसे इस तरह से संकीर्ण कर सकते हैं ... उदा।

- (void)release { 
    [super release]; //Set breakpoint here 
} 
+0

बस रिलीज विधि को ओवरराइड करने का प्रयास करें और वहां एक ब्रेक डालें ... इसे रास्ते में 21 बार कहा जाता है (मुझे लगता है कि मैंने किया है सिलेक्ट्रोवएट इंडेक्सपैथ द्वारा ट्रिगर किया गया) और फिर दृश्य से पीछे हटने पर 8 या तो। यकीन नहीं है कि मुझे क्या देखना चाहिए ... वहां बहुत सारी ढांचे की कॉल है ("बैंगनी"?!?, आदि ...) – Meltemi

+0

मिथोजेन एक अच्छा बिंदु लाता है - आपको उन स्थानों की तलाश करनी चाहिए जहां दृश्य रिलीज हो रहा है (यही कारण है कि अंततः अपवाद का कारण बनता है, जब यह पहले से चलने वाली परत को रद्द करने का प्रयास करता है।) –

+0

समस्या मुझे मिली, मुझे लगता है। कम से कम यह अब दुर्घटनाग्रस्त नहीं है। मेरे पास UIView उपclass के 2 उदाहरण थे जो MyVC के दृश्य के सबव्यूव थे ... लेकिन इसके लिए माईवीसी को वापस संवाद करने की भी आवश्यकता थी, इसलिए इसके लिए एक संपत्ति थी। मैंने उस संपत्ति को असाइनमेंट (रखरखाव के बजाए) के अनुसार स्थापित किया है, विडंबना यह है कि यहां एक टिप्पणी में आपके निर्देश: । यह समझ में आता है कि मुझे वीसी को बरकरार रखना क्यों नहीं चाहिए, इसलिए मैं एक सतत चक्र के साथ समाप्त नहीं होता ... लेकिन मैं इसे दुर्घटनाग्रस्त करता हूं। मैं, जाहिर है, अभी भी कुछ गलत समझ रहा हूँ। यदि आपके पास समय है तो सलाह/आलोचना में आपका स्वागत है ... – Meltemi

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