¿Cuál es la forma correcta de establecer un outparam NSError desde dentro de un bloque de autoreleasepool?

Tengo un método como este:

- (void)processAThing:(id)thing error:(NSError * __autoreleasing *)error { @autoreleasepool { // Start processing. // Find some partway through error.. if (error) { *error = [NSError errorWithDomain...]; return NO; } // More processing. } } 

Esto se rompe y falla, porque el NSError se autorelease, y cuando ocurre el retorno, el grupo se agota, por lo que lo que recibe el que llama es ahora falso.

Sé que podría networkingiseñar significativamente el método, así que recojo todos los casos de error fuera del bloque de autorelease, pero quiero entender si hay una forma correcta de manejar el object de error en esta situación. No puedo asignar / init un NSError especulativo fuera del bloque de grupo, porque las properties del dominio y del código son solo de lectura (y creo que la reference desaparecerá cuando el método vuelva).

Resuelve el problema si cambio la statement del método a esto:

 - (void)processAThing:(id)thing error:(NSError * __strong *)error 

Pero luego necesito quejarse en el sitio de llamadas de una manera no estándar, y esto parece atroz para que la persona que llama pague el precio de mi reserva de autoreal.

¿Alguna idea? Gracias.

Yo mismo tuve este problema. En este caso, creo que solo necesita declarar una nueva reference fuerte justo antes de la @autoreleasepool , y establecer el argumento del método justo después del bloque @autoreleasepool de esa reference temporal.

 - (void)processAThing:(id)thing error:(NSError * __autoreleasing *)error { __strong NSError *errOut = nil; @autoreleasepool { // do your stuff and set errOut instead of error } if (error) { *error = errOut; } } 

(escrito en el browser, no error verificado por el comstackdor)

En cuanto a su return prematuro, supongo que tendrá que usar una label de salto (aunque no sea bonita).