2010-11-10 17 views
6

पर रिलीज मोड में क्रैश हो जाता है मेरे पास एक ऐप है जो मैं लिख रहा हूं जब मैं "EXC_BAD_ACCESS" के साथ UIScrollView पर addSubview को कॉल करता हूं। यह केवल आईफोन 3 जी पर रिहाई मोड में और केवल डिवाइस पर करता है। मैं इन सभी अन्य विन्यास में ठीक काम करता है:आईफोन ऐप केवल 3 जी

iPhone 3G - डीबग मोड iPhone 3GS - डीबग और रिलीज मोड iPhone 4 - डीबग और रिलीज मोड सिम्युलेटर - सभी।

इसके अलावा, ऐसा कोई तर्कसंगत कारण नहीं है कि यह क्यों हो रहा है। मेरा ऑब्जेक्ट मेरे किसी भी कोड द्वारा जारी नहीं किया गया है।

उत्तर

2

मैं आपको स्मृति की बुरी पहुंच का कारण बनने के लिए NSZombieEnabled का उपयोग करने की सलाह देता हूं।

  • क्या आप DEBUG/रिलीज का उपयोग अपने कोड को शाखा में परिभाषित करते हैं?
  • क्या आप अपने कोड को ब्रांच करने के लिए एसडीके संस्करण चेकर्स का उपयोग करते हैं?

अन्यथा मैं नहीं देख सकता कि आपका ऐप विभिन्न उपकरणों/कॉन्फ़िगरेशन पर अलग-अलग व्यवहार कैसे कर सकता है।

+0

मेरे पास NSZombieEnabled है लेकिन यह इस मामले में काम नहीं कर रहा है .. इसके अलावा, मैं किसी भी एसडीके संस्करण चेकर्स का उपयोग नहीं कर रहा हूं।मेरी HTTP लाइब्रेरी में कुछ छोटी चीजें हैं लेकिन यह कोड के इस क्षेत्र से संबंधित नहीं है। – whitehawk

+0

आप उन 3 डिवाइसों में से प्रत्येक पर कौन सी आईओएस चल रहे हैं? क्या आपके पास डेबग/रिलीज परिभाषा का उपयोग करके सशर्त संकलन है? आप किसी वस्तु को अस्वीकार कर रहे हैं, क्या आप उस कोड को पोस्ट कर सकते हैं? –

0

मैंने कभी "हल नहीं किया" लेकिन मैंने अपमानजनक कोड को ट्रैक किया। मुझे संदेह है कि क्वार्ट्ज कोड के इस सेगमेंट में कुछ ऐसा था जो बफर को कोर के अंदर कहीं गहरा कर देता था - और यह केवल 3 जी पर एक समस्या का कारण बनता था। इस सेगमेंट के लिए सेटअप के कुछ शामिल किया गया है नहीं, लेकिन यह निश्चित रूप से जहां यह हो रहा है:

gradient = CGGradientCreateWithColors(space, (CFArrayRef)colors, locations); 
CGContextAddPath(context, path); 
CGContextSaveGState(context); 
CGContextEOClip(context); 
transform = CGAffineTransformMakeRotation(1.571f); 
tempPath = CGPathCreateMutable(); 
CGPathAddPath(tempPath, &transform, path); 
pathBounds = CGPathGetPathBoundingBox(tempPath); 
point = pathBounds.origin; 
point2 = CGPointMake(CGRectGetMaxX(pathBounds), CGRectGetMinY(pathBounds)); 
transform = CGAffineTransformInvert(transform); 
point = CGPointApplyAffineTransform(point, transform); 
point2 = CGPointApplyAffineTransform(point2, transform); 
CGPathRelease(tempPath); 
CGContextDrawLinearGradient(context, gradient, point, point2, (kCGGradientDrawsBeforeStartLocation | kCGGradientDrawsAfterEndLocation)); 
CGContextRestoreGState(context); 
CGGradientRelease(gradient); 
0

आप कहते हैं कि "मेरी वस्तु मेरे कोड के किसी भी द्वारा जारी नहीं किया गया है"। मैंने पाया है कि ऑब्जेक्टिव-सी में उन स्थितियों में भाग लेने के लिए असामान्य नहीं है जहां आपके कोड ने स्पष्ट रूप से किसी ऑब्जेक्ट को जारी नहीं किया है, फिर भी ऑब्जेक्ट को सभी जारी किया गया है। उदाहरण के लिए, मेरे सिर के ऊपर से, मान लीजिए कि आपके पास 1 की गिनती के साथ ऑब्जेक्ट # 1 है और आप इसे रिलीज़ करते हैं लेकिन फिर इसे गलती से स्वतः ही करें। फिर, से पहले ऑटोरेलीज पूल वास्तव में निकाला जाता है, आप एक नई वस्तु # 2 आवंटित करते हैं - यह असंभव नहीं है कि यह नया ऑब्जेक्ट # 2 ऑब्जेक्ट # 1 के समान पते पर आवंटित किया जा सकता है। तो जब ऑटोरेलीज पूल को बाद में निकाला जाता है, तो यह गलती से ऑब्जेक्ट # 2 जारी करेगा।

+0

अरे, व्यापक स्थैतिक विश्लेषण के बाद, रिसाव उपकरण का उपयोग करके प्रदर्शन विश्लेषण, और मेरे कोड की जांच करने के बाद, मैं काफी आश्वस्त हो गया हूं कि यह एक रिसाव मुद्दा नहीं है। मैं गलत हो सकता था लेकिन मैंने उपरोक्त कोड के अपमानजनक खंड को पोस्ट किया है। एक नज़र डालने के लिए स्वतंत्र महसूस करें। – whitehawk

1

मैं रिलीज सेटिंग्स के अनुकूलन स्तर को "कोई नहीं" में बदलने का प्रस्ताव कर सकता हूं। मुझे एक ही समस्या से कुछ बार मिले (विभिन्न ऐप्स के साथ) और इसे इस तरह हल किया।

12

मुझे हाल ही में एक ही समस्या थी, हालांकि मुझे पूरा यकीन नहीं है कि कारण वही है। मैं आपको बता सकता हूं कि मेरे लिए इस मुद्दे को हल किया गया है (हालांकि मैं अभी भी समाधान से पूरी तरह से संतुष्ट नहीं हूं)।

अंत में, यह एक कंपाइलर समस्या की तरह लगता है, और यह पुष्टि कर सकता है कि दूसरों ने कंपाइलर अनुकूलन के बारे में क्या कहा है। मैं एक्सकोड 4.0 (4A304a का निर्माण) का उपयोग कर रहा हूं। मुद्दा एलएलवीएम कंपाइलर 2.0 कोड जनरेशन के साथ था। विशेष रूप से एक कुंजी: "अनुकूलन स्तर"

डीबग "कोई नहीं" पर सेट किया गया था। रिलीज करने के लिए स्थापित किया गया था "सबसे तेज, सबसे छोटा"

रिलीज बदलने "कोई नहीं" दुर्घटना तय करने के लिए (और इसी तरह डीबग बदलते "सबसे तेजी से, सबसे छोटा" एप्लिकेशन लॉन्च पर दुर्घटना की वजह से करने के लिए)।

+0

यह मेरे लिए जवाब है! आपका बहुत बहुत धन्यवाद! – datayeah

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