2015-02-22 8 views
5

मेरे पास एक बहुत ही असामान्य मुद्दा है।आईओएस 64 बिट @ ट्री {...} @catch {...} काम नहीं कर रहा

हाल ही में मैंने अपने आईओएस प्रोजेक्ट (arm64) में 64 बिट समर्थन जोड़ा, ऐसा करने के बाद से मैंने @[email protected] के अंदर अपने कोड के सेगमेंट के लिए अपरिपक्व अपवाद प्राप्त करना शुरू किया (मैं क्रैश रिपोर्टिंग के लिए क्रैशलिटिक्स का उपयोग कर रहा हूं)। मैं अपने एप्लिकेशन में कहीं कोड की निम्न लाइनों के साथ समस्या पुन: पेश करने में कामयाब (मैं उन्हें मेरे विचार नियंत्रकों में से एक की init अंदर लिखा था):

@try { 
    NSMutableDictionary *m = [[NSMutableDictionary alloc] init]; 
    NSString *s; 
    m[s] = @"poop"; 
} @catch (NSException *e) { 
    NSLog(@"POOP"); 
} 

अपवाद @catch खंड के बजाय UncaughtExceptionHandler द्वारा पकड़ा जाता है। मैं उलझन में हूं कि इसका कारण क्या हो सकता है। कंसोल में उत्पादन:

2015-02-22 19:19:53.525 [391:30650] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil' 
*** First throw call stack: 
(0x18823a59c 0x1989400e4 0x1881251f8 0x10011e2f4 0x10011e068 0x10010e480 0x10010db78 0x10010d944 0x1000a8050 0x100075d88 0x100075160 0x100142044 0x100141f6c 0x18c9ecaa0 0x18caa1fb4 0x18caa1eb0 0x18caa134c 0x18caa0ff8 0x18caa0d18 0x18caa0c98 0x18c9e9648 0x18c341994 0x18c33c564 0x18c33c408 0x18c33bc08 0x18c33b98c 0x18cc76dbc 0x18cc77c68 0x18cc75dec 0x1904b162c 0x1881f2a28 0x1881f1b30 0x1881efd30 0x18811d0a4 0x18ca573c8 0x18ca523c0 0x1000747d8 0x198faea08) 
libc++abi.dylib: terminating with uncaught exception of type NSException 

मैं कस्टम अपवाद संचालक मेरे पास है और Crashlytics, अभी भी कोई सफलता अक्षम करने कि दूर करने की कोशिश की।

जैसे ही मैं arm64ARCHS और VALID_ARCHS से कोड काम करता हूं और अपवाद को अपेक्षित के रूप में पकड़ा जाता है।

किसी भी जानकारी की सराहना की जाएगी!


छोटे अपडेट - हमारे एक्ससीटीएस ने अपवादों को पकड़ना भी शुरू नहीं किया, अब तक व्यवहार केवल 64 बिट फोन पर ही हुआ है।

+0

अपवाद संचालन 32 बिट और 64 बिट के बीच अर्थ विज्ञान बदल दिया है। यह तकनीकी रूप से अभी भी काम कर सकता है, शायद। आप '@catch (id e)' का उपयोग करके इसे "ठीक" कर सकते हैं। लेकिन मत करो; प्रवाह नियंत्रण के लिए अपवादों का उपयोग करना - त्रुटियों से पुनर्प्राप्त करने का प्रयास करने के लिए - आईओएस में एक स्वीकार्य पैटर्न नहीं है। – bbum

+1

@bbum मैं प्रवाह-नियंत्रण के लिए अपवादों का उपयोग नहीं कर रहा हूं, यह 32 बिट और 64 बिट के बीच के अंतर और @try का व्यवहार क्यों है .. @ पकड़ अलग है। '@catch (id e)' या '@catch (...) 'का उपयोग करके या तो काम नहीं कर रहा है। –

+0

ठीक है - अजीब, फिर। @gparker पता होगा। – bbum

उत्तर

4

का एक लंबा सत्र के बाद Git-bisecting अपराधी था लिंकर झंडा निम्नलिखित

-no_compact_unwind

मैं BlocksKit v2.2.0 जो अभी भी है कि झंडा था, भले ही यह libffi (BlocksKit के नवीनतम संस्करण का उपयोग बंद कर प्रयुक्त अनियंत्रित ध्वज हटा दिया)। जैसे ही मैंने उस लिंकर ध्वज को हटा दिया 64 बिट @[email protected] ब्लॉक फिर से काम करना शुरू कर दिया।

मुझे अभी भी पूरी तरह से समझ नहीं है कि यह व्यवहार क्यों होता है लेकिन मैं थोड़ा और खोदने जा रहा हूं और अगर मुझे कुछ दिलचस्प लगता है तो यह धागा अपडेट करें।

ओफ़्फ़

+0

क्या आप विवरण में समझा सकते हैं? ऊपर ध्वज को जोड़ने/हटाने के लिए कहां? जैसा कि मैंने 'अन्य लिंकर ध्वज' में कोशिश की लेकिन यह काम नहीं कर रहा है।Pls – milanpanchal

+1

@ मिलनपंचल को ध्वज 'libffi' द्वारा जोड़ा गया था, मुझे लगता है कि मैंने मैन्युअल रूप से 'libffi' pod प्रोजेक्ट से उस ध्वज को हटा दिया है लेकिन आज' ब्लॉक्सकिट 'को' libffi' की आवश्यकता नहीं है, इसलिए आपको समस्या नहीं होनी चाहिए। आप इसे कहां उपयोग करते हैं, यह जानने के लिए 'git grep no_compact_unwind' करने का प्रयास करें –

+0

thx बहुत कुछ! Btw। इस मुद्दे के लिए गहरा कारण क्या है? – kimimaro

1

आईओएस और उद्देश्य-सी अपवादों पर केवल प्रोग्राम निष्पादन नियंत्रण के लिए गैर-पुनर्प्राप्ति योग्य प्रोग्रामिंग त्रुटियों के लिए उपयोग किया जाना चाहिए।

विशेष रूप से वे एपीआई में स्टैक फ्रेम में कैच को संभाल नहीं पाते हैं।

+4

के साथ आईफोन 6 पर काम नहीं कर रहा है मैं निष्पादन/प्रवाह नियंत्रण के लिए अपवादों का उपयोग नहीं कर रहा हूं। यह 32 बिट और 64 बिट के बीच व्यवहार परिवर्तन के बारे में एक सवाल है। –

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