2009-12-01 19 views
51

Ho dichiarato un NSMutableArray *categories nel file .h del controller di visualizzazione e ne ho dichiarato una proprietà.NSMutableArray addObject non funzionante

Nel metodo della NSXMLParser delegato nel mio file .m parser:foundCharacters:, ho questo codice:

-(void)parser:(NSXMLParser *) parser foundCharacters:(NSString *)string 
{ 
    if (elementFound) 
    { 
     element = string; 
     [self.categories addObject:element]; 
    } 
} 

Ma quando mi passa il mouse sopra la linea [self.categories addObject:element] dopo passo in esso in modalità debug, XCode me la dice la dimensione è 0x0, 0 oggetti. Ci sono 3 elementi nel mio file XML quindi 3 elementi dovrebbero essere nell'array.

Mi manca qualcosa di veramente ovvio e non riesco a capire cosa.

+3

Per la pubblicazione futura: il metodo per formattare il codice consiste nel selezionare il blocco di codice e rientrare tutti i 4 spazi utilizzando il pulsante di formattazione "codice" nella parte superiore dell'editor di post. –

+0

mi dispiace - ho copiato e incollato da un altro forum, suppongo che la formattazione non regge molto! grazie – joec

risposta

140

La parte "0x0" è un indirizzo di memoria. Nello specifico, "nil", il che significa che il tuo array mutabile non esiste al momento in cui viene chiamato. Prova a creare nel vostro metodo di -init:

categories = [[NSMutableArray alloc] init]; 

Non dimenticare di rilasciarlo nel vostro -dealloc.

+11

Non so perché continuo a dimenticarmi di farlo. Grazie. – James

+17

(Aggiornamento 2012: se stai usando ARC, la parte release/dealloc può essere ignorata.) –

+4

Grazie! È facile continuare a dimenticare che i messaggi per i riferimenti a oggetti nulli non falliscono in Objective-C. – JasonD

6

inizializzare un array vuoto utilizzando

categories = [NSMutableArray array]; 

Procedimento classe array sono autoreleased quindi nessun bisogno di rilasciare.

+0

Vishu - La tua soluzione funziona, ma penso che la soluzione di Joshua Nozzi sia migliore dato che ha bisogno di meno memoria. –

+0

Questo è funzionalmente equivalente alla mia risposta di cinque anni e mezzo, usando solo il metodo di convenienza invece di alloc/init. Non c'è differenza nell'uso della memoria e il risultato è esattamente lo stesso. –

-2
@property (Strong, nonatomic) NSMutableArray * yourArray; 

è necessario utilizzare Strong.

+0

Questo non risponde alla domanda - l'array non è inizializzato in modo che non esista (quindi è nullo). Inoltre, 'strong' è l'impostazione predefinita per le proprietà ObjC 2, ma non sappiamo nulla di come viene dichiarato dal codice fornito; tutto quello che sappiamo è che non esiste in fase di runtime e sembra essere un ivar di una classe, quindi sappiamo solo che il problema è che non viene assegnato alcun array nel momento in cui viene chiamato il metodo. È possibile che * possa * essere stato creato in fase di avvio e rimosso altrove. Il mio punto è che questa risposta fa molte ipotesi ed è molto vaga. Non vedo cosa aggiunga alla risposta più vecchia accettata. –