2011-09-25 14 views
9

En un entorno ARC, tengo el siguiente código:Tipo de conversión de Y sí provoca error del compilador

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]; 

establecer el argumento de que el índice 2 (&self) hace que el siguiente error del compilador:

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

No tengo idea de cómo solucionar esto manteniendo un código válido. Por el momento me estoy quedando en NULL y envolver la declaración de invocación en un bloque try/catch, pero esa es una solución menos que ideal.


Un problema similar, si alguien sería tan amable de hacer frente a ella, así:

Con esta línea de código (de la biblioteca MPOAuth)

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

me sale el siguiente error

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

+1

¿Hay algún motivo particular por el que desee utilizar una Invocación NS en lugar de un bloque aquí? – NSResponder

+0

No estoy seguro, es parte del SDK de Dropbox. Solo estoy haciendo que sea compatible con ARC, tratando de no estropear demasiado el código. – FeifanZ

Respuesta

0

En lugar de cambiar el SDK (Dropbox ha dicho que pronto publicarán una versión compatible con ARC), descubrí que puedo usar ARC selectivamente para un archivo. Así que hice eso.

Y luego actualicé al 1.0b2, que está empaquetado como una biblioteca y el problema está resuelto.

13

Usted debe ser capaz de echarlo a conseguir un tipo de puntero apropiado:

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

esta línea:

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

se puede resolver de la siguiente manera:

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

Así que en esencia acaba de dar el tipo de referencia que espera que el parámetro a cabo. Y cuando se complete el param, transfiera la propiedad a su tipo de cacao.

Cuestiones relacionadas