/ / यह उद्देश्य C कोड EXC_BAD_ACCESS कोड = 1 के साथ क्रैश क्यों होता है? (ब्लॉक सिंटैक्स और डाइक का उपयोग करता है) - आईओएस, ऑब्जेक्टिव-सी, एनएसडीएनडीओ, ऑब्जेक्टिव-सी-ब्लॉक

क्यों EXC_BAD_ACCESS कोड के साथ इस उद्देश्य C कोड क्रैश करता है = 1?(ब्लॉक सिंटैक्स और dicts का उपयोग करता है)-ios, उद्देश्य-c, nsdictionary, उद्देश्य-सी-ब्लॉक

//Section 1 (declarations)

NSString *foo;
NSString *bar;

NSDictionary *foobar =
@{
@"bar":^{return @"foo";}
};
typedef NSString *(^barfoo)();

उपरोक्त घोषणाओं को देखते हुए, निम्नलिखित उद्देश्य-सी कोड की केवल अंतिम पंक्ति ही क्यों उत्पन्न होती है

EXC_BAD_ACCESS कोड = 1

//Section 2 (crashes)

foo = foobar[@"bar"];             //no error, foo == @"foo"
bar = foobar[@"foo"];             //no error, bar == nil
foo = ((barfoo)foobar[@"bar"])(); //no error, foo == @"foo"
bar = ((barfoo)foobar[@"foo"])(); //EXC_BAD_ACCESS code=1
NSLog(@"%@%@",foo,bar);           // never runs!

मुझे ध्यान देना चाहिए कि कोशिश / पकड़ में, पकड़ कुछ भी नहीं पकड़ती है; कोई अपवाद नहीं फेंका जाता है। बदलना foobarके लिए सामग्री @{@"bar":^NSString*{return @"foo";} सहायता नहीं करता है।

मुझे यह भी ध्यान रखना चाहिए कि निम्नलिखित कोड काम करेगा तथा त्रुटि नहीं करता है:

//Alternate Section 2 (does not crash)

barfoo foobard = foobar[@"foo"];
barfoo barfood = foobar[@"bar"];
barfood ? foo = barfood() : nil;
foobard ? bar = foobard() : nil;
NSLog(@"%@%@",foo,bar);          // Returns foo(null)

नोट: कोड iOS 9.2.1 पर निष्पादित हो रहा है।

उत्तर:

उत्तर № 1 के लिए 4

मैं उलझन में हूं कि क्यों आप उलझन में हैं।

जबसे foobar[@"foo"] है nil (जैसा कि आपकी टिप्पणी सही ढंग से दिखाती है) आप इसे एक ब्लॉक के रूप में नहीं मान सकते हैं और इसे कॉल कर सकते हैं। इसीलिए ((barfoo)foobar["@foo"])() दुर्घटनाओं।

दूसरा कोड सेगमेंट बस कुछ भी नहीं कहता है जब यह पता लगाता है कि जिस ऑब्जेक्ट को आपको फॉर्म मिला है वह है nil इसलिए यह वापसी के साथ कुछ नहीं करता है foobar[@"foo"]

विषय में try catch - यह एक त्रुटि नहीं है, यह दुर्घटनाओं। वह कुछ अलग है। कुछ कार्यक्रम से उबर नहीं सकता है। डेवलपर के रूप में आपको जो कुछ करना है वह सुनिश्चित नहीं होता है। यह सुनिश्चित करना आपका काम है कि आप जिस ब्लॉक को लागू करने की कोशिश कर रहे हैं, वह वास्तव में गैर है-nil.