2015-01-02 6 views
5

To pytanie jest podobne do ios NSError types, ale opisane tam rozwiązanie nie działa i uważam, że nie jest całkiem czego potrzebuję.Wysyłanie 'NSError * const __strong *' do parametru typu 'NSError * __ autoreleasing *' zmienia właściwości zatrzymania/zwolnienia wskaźnika

Mam metodę, która przyjmuje wywołanie asynchroniczne, a następnie wywołuje blok zakończenia. Kiedy próbuję przekazać NSError ** do bloku realizacji, otrzymuję ten błąd:

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

Kod jest następujący: błąd

+(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

Masz pewne podstawowe niezrozumienie tego, co oznacza wskaźnik do wskaźnika a środek wskaźnika. – Andy

+0

Andy: Przyznaję, że trochę czasu zajmuje mi znalezienie czegoś, co później okazuje się całkiem oczywiste! –

Odpowiedz

5

Twoje argumenty są całkowite ukończenie bloku nonsens.

Masz zmienną NSError * err na stosie wywołań.

Następnie próbujesz przekazać adres err do bloku zakończenia, który zostanie wywołany w głównym wątku. Do czasu, gdy wywoływany jest blok ukończenia, twoja funkcja od dawna wraca, a błąd & jest bzdurą. Jeśli blok zakończenia próbowałby tam coś zapisać, zapisałby NSError *, gdzie jakiś czas temu zmienna err znajdowała się na stosie, najprawdopodobniej nadpisując pewne cenne dane całkowicie niepowiązanej metody.

To po prostu nie działa z blokami oddzwaniania.

5

mijają wartości, a nie przez odniesienie, czyli zmiany zablokować podpis do void (^)(AKAgentProfile * agentProfile, NSError * error) i przekazać error zamiast &error.

-1

Masz błąd zdefiniowany jako argument w

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

a następnie ponownie w bloku, proponuję zmienić nazwę jednego w bloku jak:

+(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); 
     }); 

    }); 
} 
Powiązane problemy