Domanda

Sono nuovo di C-obiettivo e ho molti problemi a provare ad aggiungere nuove righe a una tabella. Si suppone che funzioni quando l'app carica un avviso che chiede all'utente se lo desidera, avvia una nuova configurazione, carica una configurazione salvata o riprende l'ultima configurazione. Ora, se selezionano, avvia una nuova configurazione, gli verrà chiesto di inserire il nuovo nome e quando toccano fatto l'app salverà la nuova configurazione in una tabella.

Al momento posso solo fare in modo che l'app memorizzi solo una configurazione nella tabella, ma se l'utente tenta di effettuare un'altra nuova configurazione, l'app si blocca. Ecco come appare il mio codice:

- (IBAction) testToAddToList
{
    nameOfConfig = @"Test Name"; //this just bypasses the user from having to enter a name

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

    [array insertObject:nameOfConfig atIndex:configListDataIndex];

    self.configListData = array;

    [array release];

    configListDataIndex ++;
}

Ho letto molto su queste cose, ma questo non sembra che dovrebbe essere troppo difficile. Inoltre sento che il problema principale è che "array" ha solo un indice e quando l'utente tenta di aggiungerne un altro, ciò provoca l'arresto anomalo dell'app.

Qualcuno potrebbe aiutarmi per favore e dirmi cosa sto facendo di sbagliato e come posso farlo bene? Per favore! ... O forse mi indichi nella giusta direzione?

È stato utile?

Soluzione

Il problema, come menziona Woofy, è che stai creando ogni volta un nuovo array, invece di afferrare l'array creato in precedenza. Quindi, la prima volta che aggiungi all'array, sostanzialmente stai facendo:

[array insertObject:nameOfConfig AtIndex:0];

ma alla successiva creazione di un nuovo array (vuoto) e la variabile configListDataIndex ora è 1, quindi si chiama

[array insertObject:nameOfConfig atIndex:1];

e crash, perché 1 è fuori limite per un array vuoto. Per risolvere questo, puoi fare qualcosa del tipo:

NSMutableArray *array;
if (self.configListData != nil)  // I know, unnecessary, but I like being explicit with my nil checks.
    array = self.configListData;
else
    array = [NSMutableArray array];

Quindi non rilasciarlo alla fine della funzione (dato che presumo che il tuo getter per configListData sia rilasciato automaticamente, o assegnazione).

Questo risolverà il problema. Inoltre, puoi sempre chiamare

[array addObject:nameOfConfig];

che aggiunge automaticamente un oggetto alla fine dell'array, in modo da poter eliminare la variabile indice. Ma dovresti prima riparare il crasher, poiché cambiare questa seconda parte nasconderà solo il bug e renderà ancora più misterioso che la nuova configurazione sostituisca solo quella vecchia.

Altri suggerimenti

Non sarebbe molto più semplice usare il metodo -addObject di NSMutableArray: invece di insertObject? perché preoccuparsi di usare una variabile extra (configListDataIndex), quando potresti semplicemente usare addObject: nameOfConfig:

[array addObject:nameOfConfig];
self.configListData = array;
[array release];

e basta.

E penso di sapere perché si sta arrestando in modo anomalo ... crei sempre un nuovo oggetto array e ogni volta che inserisci " nameOfConfig " in una posizione diversa nell'array vuoto sempre nuovo. E per questo motivo, configListData avrà sempre un solo oggetto al suo interno. Non sarebbe molto meglio modificare direttamente configListData?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top