2009-03-11 7 views
7

Sono sicuro che sto facendo qualcosa di sciocco, ma questo mi sta facendo impazzire.Il conteggio NSMutableArray restituisce sempre zero

Sto provando a scorrere i risultati del database, creare oggetti da questi risultati e aggiungere gli oggetti a un NSMutableArray. Ho verificato tramite NSLog chiamate che i dati vengono correttamente letti dal database e copiato l'oggetto, ma il conteggio per la NSMutableArray sempre ritorna 0.

Ecco l'essenza del codice:

while ([rs next]) { 

    Kana *htemp = [Kana alloc]; 

    htemp.content = [rs stringForColumn:@"hiragana"]; 
    [hiragana addObject:htemp]; 

} 
NSLog(@"Hiragana contains %d objects", [hiragana count]); 

Kana deriva da NSObject e hiragana è un'istanza di NSMutableArray.

Sono sicuro che questo è un errore da principiante, e spero che qualcuno possa dirmi chiaramente. TIA! :)

risposta

39

La mia ipotesi, a giudicare dal codice che hai postato, è che probabilmente non stai allocando il tuo array correttamente. Quando si creano oggetti, è necessario inizializzarli. Pertanto, questo:

Kana *htemp = [Kana alloc]; 

dovrebbe essere:

Kata *temp = [[Kana alloc] init]; 

Tutti gli oggetti devono essere inizializzato in questo modo. Così, se sono corrette e non è stato inizializzato l'array, allora la vostra creazione ha bisogno di andare da questo:

NSMutableArray *hiragana = [NSMutableArray alloc]; 

a questo:

NSMutableArray *hiragana = [[NSMutableArray alloc] init]; 

Per motivi di ottimizzazione, probabilmente si dovrebbe anche specificare una capacità iniziale e se avete qualche idea quanti oggetti si potrebbe tenere:

[[NSMutableArray alloc] initWithCapacity:someNumber]; 
+0

la tua risposta è buona - dovresti anche includere i consigli menzionati di seguito per rilasciare l'oggetto htemp dopo averlo aggiunto all'array, oppure è una grande perdita di memoria. – danielpunkass

+0

grazie per questa domanda e risposta ... mi aiuta così! (N_n) –

0

alcune cose:

  1. Che cosa succede se si mette una chiamata NSLog all'interno del ciclo while? Verificare che le iterazioni del ciclo stiano effettivamente accadendo prima di incolparlo sull'array.
  2. Dove stai creando l'array hiragana? Se lo fai in modo errato per qualche motivo e l'array è nullo, potrebbe causare problemi come questo.
  3. Se non si dispone di Garbage Collection on, assicurarsi di eseguire [htemp release] dopo averlo aggiunto al ciclo. addObject mantiene e ogni elemento aggiunto colerà dal ciclo. Ancora una volta, questo è rilevante solo se la garbage collection è disattivata.

E 'più probabile che sia non si è creato l'array correttamente o rs non contiene quello che ci si aspetta di contenere, e così [rs successiva] non è sempre chiamato mai (se RS è pari a zero, per esempio, non verranno eseguite iterazioni di questo ciclo e non si avrebbe alcun tipo di errore).

+0

Ahh ... è stata un'inizializzazione di array errata FTW! :) Grazie! –

2

Un'altra causa comune (non nel tuo caso, come si scopre, ma gener alleato) sta dimenticando persino di allocare l'array. Se non hai ancora creato un array, invii il messaggio count a nil, quindi il risultato sarà sempre 0.

Problemi correlati