2011-10-27 18 views
6

Estoy convirtiendo algunos códigos en ARC. El código busca un elemento en un NSMutableArray, luego lo encuentra, lo elimina y lo devuelve. El problema es que el elemento se cancela la asignación inmediatamente después de "removeObjectAtIndex":removeObjectAtIndex provoca "mensaje enviado a la instancia desasignada"

- (UIView *)viewWithTag:(int)tag 
{ 
    UIView *view = nil; 
    for (int i = 0; i < [self count]; i++) 
    { 
     UIView *aView = [self objectAtIndex:i]; 
     if (aView.tag == tag) 
     { 
      view = aView; 
      NSLog(@"%@",view); // 1 (view is good) 
      [self removeObjectAtIndex:i]; 
      break; 
     } 
    } 
    NSLog(@"%@",view); // 2 (view has been deallocated) 
    return view; 
} 

Cuando corro, me sale

*** -[UIView respondsToSelector:]: message sent to deallocated instance 0x87882f0 

en la segunda declaración de registro.

Pre-ARC, tuve cuidado de conservar el objeto antes de llamar a removeObjectAtIndex :, y luego para liberarlo automáticamente. ¿Cómo le digo a ARC que haga lo mismo?

+0

¿Qué '[removeObjectAtIndex auto: i];' hago? – hypercrypt

Respuesta

5

declarar la referencia UIView *view con el __autoreleasing calificador, así:

- (UIView *)viewWithTag:(int)tag 
{ 
    __autoreleasing UIView *view; 
    __unsafe_unretained UIView *aView; 

    for (int i = 0; i < [self count]; i++) 
    { 
     aView = [self objectAtIndex:i]; 
     if (aView.tag == tag) 
     { 
      view = aView; 
      //Since you declared "view" as __autoreleasing, 
      //the pre-ARC equivalent would be: 
      //view = [[aView retain] autorelease]; 

      [self removeObjectAtIndex:i]; 
      break; 
     } 
    } 

    return view; 
} 

__autoreleasing le dará exactamente lo que quiera, porque en asignación se mantiene la nueva pointee, autoreleased, y luego se almacena en el lvalue

Véase el ARC reference

+2

Pensé '__strong' es el valor predeterminado? ¿No hará esto de todos modos? – Robert

+0

@Robert Lo sentimos, mira actualizado. –

+0

Gracias Jacob. Dos cosas: 1) Tuve que usar __unsafe_unretained en lugar de __weak, porque deseo mantener la compatibilidad de iOS 4. 2) Resulta que ARC NO se ha activado para ese archivo. Error tonto Tuve que ir y eliminar "fno-obj-arc" en la sección de fuentes de compilación target-> build phases->. – lewisanderson

Cuestiones relacionadas