2010-04-05 14 views
7

हमारा ऐप छद्म साबित होने वाली बग के कारण 1,500 लॉन्च में लगभग 1 की आवृत्ति के साथ क्रैश हो रहा है। स्टैक ट्रेस का प्रासंगिक भाग शामिल है। इसे कॉलबैक के रूप में निकाल दिया जा रहा है, इसलिए मेरे पास कोई संदर्भ नहीं है कि यह मेरे कोड में कहां हो रहा है।UIAlertView अनियंत्रित विधि पर क्रैशिंग

ऐसा लगता है कि UIViewAnimationState ऑब्जेक्ट है जो UIAlertView's निजी विधि (_popoutAnimationDidStop:finished:) पर कॉल कर रहा है। केवल समस्या यह है कि, इस बिंदु से UIAlertView को हटा दिया गया है। मैं अलर्ट विचारों के साथ अजीब कुछ भी नहीं करता। मैंने उन्हें फेंक दिया, और मैं उपयोगकर्ता इनपुट की प्रतीक्षा करता हूं। वे सभी रिलीज होने से पहले दिखाए जाते हैं।

किसी को भी इसका सामना करना पड़ा? इस बिंदु पर, मैं एक ऐप्पल बग होने की ओर झुका रहा हूँ।

Thread 0 Crashed: 
0 libobjc.A.dylib     0x3138cec0 objc_msgSend + 24 
1 UIKit       0x326258c4 -[UIAlertView(Private) _popoutAnimationDidStop:finished:] 
2 UIKit       0x324fad70 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] 
3 UIKit       0x324fac08 -[UIViewAnimationState animationDidStop:finished:] 
4 QuartzCore      0x311db05c run_animation_cal 

lbacks

+0

क्या आपको डीबगर में मिली त्रुटि याद है? क्या यह संभवतः था: [* प्रतिसाद देता है चयनकर्ता:]: संदेश को हटाए गए उदाहरण – Cole

उत्तर

12

यह संभावना है कि UIAlertView अपने प्रतिनिधि पर एक विधि कॉल करने के बाद कि प्रतिनिधि जारी की गई है की कोशिश कर रहा है। इस प्रकार की बग को रोकने के लिए, जब भी आप ऑब्जेक्ट को किसी अन्य ऑब्जेक्ट के प्रतिनिधि के रूप में सेट करते हैं, प्रतिनिधि प्रतिनिधि को प्रतिनिधि ऑब्जेक्ट की डेलोक विधि में शून्य पर सेट करें। जैसे


@implementation YourViewController 
@synthesize yourAlertView; 

- (void)dealloc { 
    yourAlertView.delegate = nil; // Ensures subsequent delegate method calls won't crash 
    self.yourAlertView = nil; // Releases if @property (retain) 
    [super dealloc]; 
} 

- (IBAction)someAction { 
    self.yourAlertView = [[[UIAlertView alloc] initWithTitle:@"Pushed" 
         message:@"You pushed a button" 
         delegate:self 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil] autorelease]; 
    [self.yourAlertView show]; 
} 

// ... 

@end 
+1

परफेक्ट धन्यवाद। स्पष्ट समाधान, मैं इस धारणा पर लटका हुआ हूं कि यह यूआईएलर्टव्यू को किसी भी समय समय से जारी किया जा रहा था। कभी-कभी आपको उस पर आंखों का एक और सेट प्राप्त करने की आवश्यकता होती है। इस पर आने वाले किसी और के लिए, ध्यान रखें कि यदि आप एक नेविगेशन स्टैक का उपयोग कर रहे हैं जिसे गैर-निर्धारक रूप से धक्का दिया जा सकता है (जैसे कनेक्शन हानि पर), तो आपको हमेशा अपने डेलोक में किसी भी प्रतिनिधि को अनसेट करना होगा। ऐप्पल इस उदाहरण को उनके उदाहरण परियोजनाओं में ठीक से चित्रित नहीं करता है। – DougW

+3

मुझे एक ही समस्या का सामना करना पड़ रहा है, क्या कोई यह बता सकता है कि अलर्टव्यू को स्थानीय चर के रूप में घोषित करने के दौरान इसे कैसे हल किया जाए। क्या हमें प्रतिनिधि कॉलबैक पर प्रतिनिधि को नियुक्त करना है? – rustylepord

+0

दिलचस्प है कि यह एआरसी मोड में संकलित ऐप्स में भी होता है। ऐप्पल ने UIAlertView की प्रतिनिधि संपत्ति को कमजोर क्यों नहीं बनाया क्योंकि वे सभी प्रतिनिधि-जैसी संपत्तियों की अनुशंसा करते हैं? – Lukasz

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