2015-01-02 35 views
5

的/釋放性這個問題類似於ios NSError types但解決方案描述有沒有工作,我認爲這是不完全是我需要的。發送「NSError * const的__strong *」到類型的參數「NSError * __ *自動釋放」改變保留指針

我有,需要一個方法執行異步調用,然後調用完成塊。當我嘗試通過NSError **來完成塊,我得到這個錯誤:

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

Andy:我承認,我花了一段時間才弄清楚事情後來證明是非常明顯的! –

回答

5

你完成塊的參數是總廢話。

你有一個變量NSError *調用堆棧上犯錯。

然後嘗試犯錯的地址傳遞給一個完成的塊,將在主線程中調用。在完成塊被調用的時候,你的函數早已返回,並且err是垃圾。如果完成塊試圖在那裏存儲任何東西,它會存儲一個NSError *,其中很久以前你的err變量在堆棧中,很可能會覆蓋一些完全不相關的方法的有價值的數據。

這只是不具有回調塊工作。

5

通行證的錯誤,而不是引用,即改變塊簽名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); 
     }); 

    }); 
} 
相關問題