Ho un metodo come questo:Qual è il modo giusto per impostare un outparam NSError all'interno di un blocco autoreleasepool?
- (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.
}
}
Questa è rotto e va in crash, perché la NSError è autoreleased, e quando il ritorno accade, la piscina è svuotata, quindi la cosa che il chiamante si è ora fasullo.
So che potrei ridisegnare in modo significativo il metodo in modo da raccogliere tutti i casi di errore al di fuori del blocco di autorelease, ma voglio capire se c'è un modo corretto di gestire l'oggetto errore in questa situazione. Non riesco ad allocare/avviare un NSError speculativo al di fuori del blocco del pool, poiché le proprietà del dominio e del codice sono in sola lettura (e continuo a pensare che il riferimento scompaia al ritorno del metodo).
Risolve il problema se cambio la dichiarazione di metodo a questo:
- (void)processAThing:(id)thing error:(NSError * __strong *)error
Ma poi ho bisogno di agitarsi intorno al luogo di chiamata in modo non standard, e questo sembra egregio per rendere il chiamante paga il prezzo per il mio autoreleasepool interno.
Qualche idea? Grazie.
Cambiare la firma in '(NSError * __strong *) error' sembra davvero un'alternativa ragionevole per me. – Poulsbo