मुझे एक ही समस्या काफी लगातार है। ऐसा लगता है कि मैं एक पॉपओवर से एक मोडल व्यू कंट्रोलर पेश कर रहा हूं, जो अच्छी तरह से परीक्षण नहीं किया गया है और ऐप्पल के कोड में एक बग ट्रिगर करता है। बग यह है कि UIKit मेरे व्यू कंट्रोलर के लिए एक अप्रत्याशित संदर्भ रखता है जिसे बाद में बर्खास्त कर दिया गया है और हटा दिया गया है, इसलिए बाद में संदर्भ हिट हो गया है। मेरा कामकाज या तो पॉपओवर से मोडल वीसी प्रस्तुत करने से बचने के लिए है, या ऐसे सभी वीसी को अनिश्चित काल तक बनाए रखने के लिए (सदस्य चर या कुछ ऐसे में)।
नीचे गोरी विवरण हैं।
यहां कोड है जिसका उपयोग मैंने समस्या को ट्रिगर करने के लिए किया था।
-(void) handlePinchFromCell:(AMPSupportingPhotoCell*) cell
{
UIViewController * vc = [[UIViewController alloc] init]; // UIViewController #0
[self presentViewController:vc animated:YES completion:nil];
[self performSelector:@selector(dismiss:) withObject:vc afterDelay:2];
}
-(void) dismiss:(UIViewController*)vc
{
[self dismissViewControllerAnimated:YES completion:^(){NSLog(@"-------");}];
}
इस कोड को एक UIViewController # 1 का एक हिस्सा है, जो एक UIPopoverController अंदर है, कि से दूसरे UIViewController # 2 है, जो खुद एक से अभी तक एक और दृश्य UIViewController 3 # प्रस्तुत अधिक पॉप है। पॉपओवर बंद होने के बाद क्रैश होता है, नियंत्रक # 2 आईडी खारिज कर दिया जाता है। अभी तक वहाँ
2013-03-13 20:04:24.681 Mercury[16698:19d03] handlePinchFromCell: a225710
2013-03-13 20:04:27.083 Mercury[16698:19d03] -------
2013-03-13 20:04:31.606 Mercury[16698:19d03] *** -[UIViewController retain]: message sent to deallocated instance 0xa225710
तो, देखा कि कुलपति # 0, आवंटित प्रस्तुत कर ली, खारिज कर दिया 2 सेकंड बाद पुनः आवंटित की जाती है, और:
अगर मैं Zombies सक्षम, मैं एक ही स्टैक ट्रेस मिलता है लेकिन एक संदेश के साथ ऐप्पल के कोड में कहीं भी इसका एक लापरवाही संदर्भ है। जब पॉपओवर बंद हो जाता है और वीसी # 2 को खारिज कर दिया जाता है, तो पूरी चीज विलुप्त वीसी तक पहुंचने की कोशिश कर क्रैश हो जाती है। मैं काफी हद तक निश्चित हूं कि यह ऐप्पल की बग है। मुझे यह भी लगता है कि यह एक पॉपओवर से वीसी पेश करने से संबंधित है, इसलिए यदि आप इससे दूर रहें, या स्वयं वीसी बनाए रखें तो आपको ठीक होना चाहिए।
एक ही समस्या के लिए एक और स्टैक ट्रेस यह है। ऐसा होता है यदि उपर्युक्त कोड दो बार चलाया जाता है:
2013-03-13 20:12:53.883 Mercury[16735:19d03] handlePinchFromCell: 16d54da0
2013-03-13 20:12:56.285 Mercury[16735:19d03] -------
2013-03-13 20:13:03.481 Mercury[16735:19d03] handlePinchFromCell: a2565f0
2013-03-13 20:13:03.481 Mercury[16735:19d03] *** -[UIViewController isKindOfClass:]: message sent to deallocated instance 0x16d54da0
(lldb) bt
* thread #1: tid = 0x1f03, 0x017f8a97 CoreFoundation`___forwarding___ + 295, stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
frame #0: 0x017f8a97 CoreFoundation`___forwarding___ + 295
frame #1: 0x017f894e CoreFoundation`_CF_forwarding_prep_0 + 14
frame #2: 0x00c42f90 UIKit`-[UIWindowController transition:fromViewController:toViewController:target:didEndSelector:] + 907
frame #3: 0x00a40ee3 UIKit`-[UIViewController presentViewController:withTransition:completion:] + 4521
frame #4: 0x00a41167 UIKit`-[UIViewController presentViewController:animated:completion:] + 112
frame #5: 0x0006c32d Mercury`-[AMPSupportingPhotosViewController handlePinchFromCell:](self=0x16d55360, _cmd=0x0007a64a, cell=0x0a22a2a0) + 205 at AMPSupportingPhotosViewController.m:184
frame #6: 0x015336b0 libobjc.A.dylib`-[NSObject performSelector:withObject:] + 70
frame #7: 0x0006f317 Mercury`-[AMPSupportingPhotoCell handlePinch:](self=0x0a22a2a0, _cmd=0x00efb0db, sender=0x0a2504a0) + 215 at AMPSupportingPhotoCell.m:53
frame #8: 0x00c2185a UIKit`_UIGestureRecognizerSendActions + 139
वास्तव में दिलचस्प है। मेरे मामले में मैं एक और मोडल व्यू कंट्रोलर से एक मोडल व्यू कंट्रोलर पेश कर रहा हूं। वही समस्या आपको लगता है? वे हमेशा सही क्रम में विचलित हो जाते हैं लेकिन आप जो कह रहे हैं उसके आधार पर ऐसा लगता है कि अगर कोई व्यक्ति पहले मोडल नियंत्रक पर हिट रद्द करता है और फिर मूल मोडल नियंत्रक पर तुरंत रद्द हो जाता है जो क्रैश को ट्रिगर कर सकता है? –
मुझे लगता है कि यह वही बात है - एक वीसी ऐप्पल के सिस्टम में कहीं भी अटक गया है। – DenNukem