2015-01-02 6 views
5

के गुणों को बनाए रखने/रिलीज करने के लिए यह प्रश्न ios NSError types के समान है लेकिन वहां वर्णित समाधान काम नहीं करता है और मुझे विश्वास है कि यह नहीं है काफी मुझे क्या चाहिए।'एनएसईआरआर * कॉन्स __strong *' प्रकार के पैरामीटर को 'एनएसईआरआरआर * __ ऑटोरेलीज़िंग *' के पैरामीटर को भेजना पॉइंटर

मेरे पास एक तरीका है जो एक एसिंक्रोनस कॉल करता है और फिर एक समापन ब्लॉक का आह्वान करता है।

Sending 'NSError *const __strong *' to parameter of type 'NSError *__autoreleasing *' changes retain/release properties of pointer

कोड इस प्रकार है के रूप में: मूल्य द्वारा

+(void) agentWithGUID:(NSString *) guid completion:(void (^)(AKAgentProfile * agentProfile, NSError ** error)) completionBlock 
{ 
    dispatch_queue_t requestQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(requestQueue, ^{ 
     NSString * parameterizedUrl = [AKAgentProfileEndPoint stringByAppendingString:guid]; 
     NSURL *url = [NSURL URLWithString:parameterizedUrl]; 
     NSData *data = [NSData dataWithContentsOfURL:url]; 

     NSError * error = nil; 

     AKAgentProfile * agentProfile = [[[AKAgentFactory alloc] init] agentProfileWithData:data error:&error]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      completionBlock(agentProfile,&error); 
     }); 

    }); 
} 
+2

आपके पास पॉइंटर-टू-पॉइंटर बनाम पॉइंटर का अर्थ क्या है, इसकी कुछ मौलिक गलतफहमी है। – Andy

+0

एंडी: मैं मानता हूं, मुझे ऐसा कुछ समझने में कुछ समय लगता है जो बाद में स्पष्ट हो जाता है! –

उत्तर

5

आपका पूरा होने के ब्लॉक तर्क कुल बकवास कर रहे हैं।

आपके पास कॉल स्टैक पर एक परिवर्तनीय एनएसईआरआर * त्रुटि है।

फिर आप एक पूर्णता ब्लॉक में गलती का पता पारित करने का प्रयास करते हैं जिसे मुख्य धागे में बुलाया जाएगा। जब तक पूरा होने वाला ब्लॉक कहा जाता है, तब तक आपका फ़ंक्शन लंबे समय से लौटा दिया जाता है, और & त्रुटि बकवास है। अगर समापन ब्लॉक ने वहां कुछ भी स्टोर करने की कोशिश की है, तो यह एक एनएसईआरर * स्टोर करेगा जहां कुछ समय पहले आपका इर वैरिएबल स्टैक पर था, संभवतः पूरी तरह से असंबंधित विधि के कुछ मूल्यवान डेटा को ओवरराइट करना संभवतः।

यह कॉलबैक ब्लॉक के साथ काम नहीं करता है।

5

दर्रा त्रुटि, नहीं संदर्भ द्वारा, यानी परिवर्तन जब मैं NSError पारित करने के लिए ** पूरा होने के ब्लॉक करने की कोशिश, मैं इस त्रुटि मिलती है void (^)(AKAgentProfile * agentProfile, NSError * error) पर हस्ताक्षर ब्लॉक करें और &error के बजाय error पास करें।

-1

आपको त्रुटि ब्लॉक में

+(void) agentWithGUID:(NSString *) guid completion:(void (^)(AKAgentProfile * agentProfile, NSError ** error)) completionBlock 

में तर्क के रूप में परिभाषित किया गया और उसके बाद फिर है, मैं सुझाव है कि आप की तरह ब्लॉक में नाम दें:

+(void) agentWithGUID:(NSString *) guid completion:(void (^)(AKAgentProfile * agentProfile, NSError ** error)) completionBlock 
{ 
    dispatch_queue_t requestQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
    dispatch_async(requestQueue, ^{ 
     NSString * parameterizedUrl = [AKAgentProfileEndPoint stringByAppendingString:guid]; 
     NSURL *url = [NSURL URLWithString:parameterizedUrl]; 
     NSData *data = [NSData dataWithContentsOfURL:url]; 

     NSError * err = nil; 

     AKAgentProfile * agentProfile = [[[AKAgentFactory alloc] init] agentProfileWithData:data error:&error]; 

     dispatch_async(dispatch_get_main_queue(), ^{ 
      completionBlock(agentProfile,&err); 
     }); 

    }); 
} 
संबंधित मुद्दे