2011-09-25 14 views
9

W środowisku ARC, mam następujący kod:Rodzaj i siebie powoduje błąd kompilatora

NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; 
[invocation setTarget:delegate]; 
[invocation setSelector:@selector(restClient:loadedFile:contentType:eTag:)]; 
// Error Here! 
[invocation setArgument:&self atIndex:2]; 
[invocation setArgument:&filename atIndex:3]; 
[invocation setArgument:&contentType atIndex:4]; 
[invocation setArgument:&eTag atIndex:5]; 

Ustawianie argument indeksie 2 (&self) powoduje następujący błąd kompilatora:

Sending *const __strong * to parameter of type void * changes retain/release properties

Nie mam pojęcia, jak to naprawić, zachowując poprawny kod. W tej chwili po prostu trzymam się NULL i zawijam instrukcję invoke w bloku try/catch, ale jest to rozwiązanie mniej niż idealne.


Podobny problem, jeśli ktoś byłby na tyle uprzejmy, aby rozwiązać go, a także:

Z tej linii kodu (z biblioteki MPOAuth)

status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, (CFTypeRef *)&attributesDictionary); 

pojawia się następujący błąd

Cast of an indirect pointer to an Objective-C pointer to 'CFTypeRef ' (aka 'const void *') is disallowed with ARC

+1

Czy istnieje jakiś szczególny powód, dla którego chcesz użyć NSInvocation zamiast bloku tutaj? – NSResponder

+0

Nie jestem pewien, jest to część SDK Dropbox. Właśnie sprawdzam zgodność z ARC, starając się nie zepsuć kodu zbyt wiele. – FeifanZ

Odpowiedz

0

Zamiast zmieniać zestaw SDK (Dropbox powiedział, że wkrótce będą publikować wersję kompatybilną z ARC), dowiedziałem się, że mogę użyć ARC selektywnie do pliku. Więc to zrobiłem.

Następnie zaktualizowałem system do wersji 1.0b2, która jest spakowana jako biblioteka, więc problem został rozwiązany.

13

Powinieneś być w stanie rzucić, aby uzyskać odpowiedni typ wskaźnika:

NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:signature]; 
[invocation setTarget:delegate]; 
[invocation setSelector:@selector(restClient:loadedFile:contentType:eTag:)]; 
Foo *foo = self; 
[invocation setArgument:&foo atIndex:2]; 
[invocation setArgument:&filename atIndex:3]; 
[invocation setArgument:&contentType atIndex:4]; 
[invocation setArgument:&eTag atIndex:5]; 
2

ta linia:

status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, (CFTypeRef *)&attributesDictionary); 

może zostać rozwiązany w następujący sposób:

CFTypeRef outDictionaryRef; 
status = SecItemCopyMatching((__bridge CFDictionaryRef)searchDictionary, &outDictionaryRef; 
attributesDictionary = (__bridge_transfer NSDictionary *) outDictionaryRef; 

Tak w istocie tylko podać rodzaj odniesienia spodziewa jako param zewnątrz. A gdy wypełnisz out-out, prześlij własność na swój typ kakao.

Powiązane problemy