2011-12-28 17 views
6

आईओएस 5 के नए TWRequest एपीआई का उपयोग करके, मैं ब्लॉक उपयोग से संबंधित एक ईंट की दीवार में भाग गया हूं।उद्देश्य-सी में ब्लॉक के भीतर ब्लॉक का उपयोग करना: EXC_BAD_ACCESS

मुझे पहले अनुरोध के लिए सफल प्रतिक्रिया प्राप्त करने के बाद क्या करना है, तुरंत किसी अन्य को आग लगाना। दूसरे अनुरोध के समापन ब्लॉक पर, मैं फिर बहु-चरण संचालन की सफलता या विफलता को सूचित करता हूं।

यहाँ मैं क्या कर रहा मोटे तौर पर बताया गया है:

- (void)doRequests 
{ 
    TWRequest* firstRequest = [self createFirstRequest]; 
    [firstRequest performRequestWithHandler:^(NSData* responseData, 
               NSHTTPURLResponse* response, 
               NSError* error) { 
     // Error handling hidden for the sake of brevity... 
     TWRequest* secondRequest = [self createSecondRequest]; 
     [secondRequest performRequestWithHandler:^(NSData* a, 
                NSHTTPURLResponse* b, 
                NSError* c) { 
      // Notify of success or failure - never reaches this far 
     }]; 
    }]; 
} 

मैं अनुरोध के दोनों को बनाए रखना नहीं कर रहा हूँ या कहीं भी उन्हें एक संदर्भ रखते हुए; यह सिर्फ आग और भूल है।

हालांकि, जब मैं अनुप्रयोग चलाने के लिए, यह EXC_BAD_ACCESS साथ पर दुर्घटनाओं:

[secondRequest performRequestWithHandler:...]; 

यह पहली बार अनुरोध ठीक कार्यान्वित करता है, लेकिन जब मैं एक हैंडलर के साथ एक दूसरा शुरू करने के लिए प्रयास करते हैं, यह दुर्घटनाओं। उस कोड के साथ क्या गलत है? ...

- (TWRequest*)createFirstRequest 
{ 
    NSString* target = @"https://api.twitter.com/1/statuses/home_timeline.json"; 
    NSURL* url   = [NSURL URLWithString:target]; 
    TWRequest* request = [[TWRequest alloc] 
          initWithURL:url parameters:params 
          requestMethod:TWRequestMethodGET]; 
    // _twitterAccount is the backing ivar for property 'twitterAccount', 
    // a strong & nonatomic property of type ACAccount* 
    request.account = _twitterAccount; 

    return request; 
} 
+0

कृपया 'createFirstRequest' और' createSecondRequest' 'कोड का कोड पोस्ट करें – vikingosegundo

+0

क्या आप' -createSecondRequest' के लिए कोड पोस्ट कर सकते हैं? मुझे लगता है कि इस कोड को पृष्ठभूमि थ्रेड पर चलने में कोई समस्या है क्योंकि इस बात की कोई गारंटी नहीं है कि पूरा थ्रेड पूरा होने वाला थ्रेड किस थ्रेड पर चल रहा है। –

+0

हो गया; खेद है कि, यह नहीं सोचा था कि यह प्रासंगिक होगा। – biasedbit

उत्तर

18

सुनिश्चित करें कि आप ACAccountStore का संदर्भ/रखरखाव रखते हैं जो ACAccount का मालिक है जिसका उपयोग आप TWRequest एस पर हस्ताक्षर करने के लिए कर रहे हैं।

यदि आप नहीं करते हैं, तो ACAccount अमान्य हो जाएगा और फिर आप TWRequest पर हस्ताक्षर करने की कोशिश करते समय EXC_BAD_ACCESS प्राप्त करेंगे।

+0

धन्यवाद! लेकिन यह थोड़ा अजीब लगता है। आपको उस ऑब्जेक्ट का संदर्भ सहेजने की आवश्यकता है जिसे आप ट्विटर अनुरोध ऑब्जेक्ट में सेट नहीं करेंगे। बहुत त्रुटि प्रवण। – HyLian

+0

वाह, यह इंगित करने के लिए धन्यवाद! – cleverbit

+0

इसने मेरे जीवन को बचाया – vangoz

1

मैं TW * से परिचित नहीं हूँ, इसलिए पर विचार यह एक जंगली अनुमान एक ढेर-आवंटित ब्लॉक भेजने की कोशिश:


बनाने के लिए अनुरोध के रूप में सरल कर रहे हैं तरीकों :

[firstRequest performRequestWithHandler:[^ (NSData *responseData, ...) { 
    ... 
} copy]]; 

स्पष्ट करने के लिए, मुझे लगता है कि ब्लॉक आप भेज रहे हैं, ढेर-आवंटित है इसलिए जब TW * यह बनाए रखने हो सकता है, यह कोई फर्क करता है, तो यह पहले से ही रों से बाहर चला गया है नहीं होगा सामना।

+0

मैंने इसका उपयोग करके अपने प्रो को हल किया क्योंकि मैं आर्क का उपयोग कर रहा हूं इसलिए बरकरार रहें ... – GameLoading