2011-10-27 11 views
6

Sto convertendo del codice in ARC. Il codice cerca un elemento in un NSMutableArray, quindi trova, rimuove e restituisce quell'elemento. Il problema è che l'elemento viene deallocata immediatamente dopo "removeObjectAtIndex":removeObjectAtIndex causa "il messaggio inviato all'istanza deallocata"

- (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; 
} 

quando l'eseguo, ottengo

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

alla seconda dichiarazione di registro.

Pre-ARC, sono stato attento a conservare l'oggetto prima di chiamare removeObjectAtIndex :, quindi a eseguire il rilascio automatico. Come dico a ARC di fare la stessa cosa?

+0

Cosa significa '[auto removeObjectAtIndex: i];' fare? – hypercrypt

risposta

5

Dichiarare il riferimento UIView *view con il qualificatore __autoreleasing, in questo modo:

- (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 vi darà esattamente ciò che si vuole, perché in missione viene mantenuto il nuovo pointee, autoreleased, e quindi memorizzati in il lvalue.

Vedi l'ARC reference

+2

Ho pensato che "__strong' è l'impostazione predefinita? Lo farò comunque? – Robert

+0

@Robert Siamo spiacenti, vedere aggiornato. –

+0

Grazie, Jacob. Due cose: 1) Ho dovuto usare __unsafe_unretained invece di __weak, perché desidero mantenere la compatibilità con iOS 4. 2) Si scopre che ARC NON è stato attivato per quel file. Errore stupido Dovevo passare e rimuovere "fno-obj-arc" nella sezione target-> build phases-> compilare sources. – lewisanderson

Problemi correlati