2011-07-13 12 views
6

sto ottenendo il seguente errore durante la rimozione dal mio NSMutableArrayNSMutableArray removeObjectAtIndex

-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x1cdced10 
2011-07-13 00:33:14.333 MassText[1726:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI removeObjectAtIndex:]: unrecognized selector sent to instance 0x1cdced10' 

Tuttavia destra prima tolgo, stampo fuori la matrice e l'indice. Né sono nulli e non ho motivo di credere perché questo errore si sarebbe verificato. Qualche idea?

+0

È sufficiente verificare se si sta allocando e iniziando correttamente NSMutableArray.Sembra che tu stia iniziando come NSArray (che non ha la funzione removeObjectAtIndex) – Krishnabhadra

+0

è un NSMuteableArray ... inizializzato e dichiarato come tale. – StanLe

+0

si prega di verificare, è il mutablearray sta andando fuori ambito o viene riassegnato da qualche parte nel codice. – Ravin

risposta

8

Ho avuto questo problema. Il mio è che ho usato casualmente questo tipo di casting.

NSMutablearray * myarray = [[NSMutableArray alloc] init]; 
myarray =(NSMutableArray*) [mydictionary allkeys]; 

Questo funziona per un po '.. ma se ci si trova in un loop stretto e grande questo tendono a fallire.

ho cambiato il mio codice per

NSMutableArray * myarray= [[NSMutablearray alloc] initWithArray:[mydictionary allKeys]]; 
+0

NSMutableArray è CaseSensitive (Modifica la risposta) –

7

L'oggetto è un NSArray, non uno NSMutableArray.

+0

È un NSMuteableArray ... inizializzato e dichiarato come tale. – StanLe

+0

Probabilmente il tipo di variabile è NSMutableArray, ma l'istanza sembra essere un NSArray dato l'output del registro. Assicurati di ricontrollare dove viene effettivamente creato l'oggetto. – ThomasW

+0

@Caleb qui sotto ha una risposta sul motivo per cui il tuo NSArray non è un array NSMutable. Vedi anche: http://stackoverflow.com/questions/3220120/nsmutablearray-addobject-nsarrayi-addobject-unrecognized-selector-sent-to – ThomasW

4

Si sta chiamando removeObjectAtIndex su un'istanza NSArray. Possiamo vedere chiaramente dal registro degli arresti anomali.

4

L'errore dice che si sta tentando di chiamare il selettore diremoveObjectAtIndex su un NSArray, che non rispondere a questo selettore.

Assicurarsi che la matrice è in realtà un NSMutableArray, non un NSArray.

+0

Ya Lo stack vuoto è corretto .... – Sabby

4

A questo punto, quattro persone intelligenti (escluso me stesso) hanno sottolineato che stai inviando -removeObjectAtIndex: a un oggetto che pensa che sia una matrice immutabile. Questo sarebbe un buon momento per iniziare a chiedersi perché la matrice è immutabile quando in precedenza si pensava che fosse mutabile. Se pubblichi un codice che mostra come viene creato l'array, qualcuno qui sarà probabilmente in grado di mostrarti cosa non funziona.

Un modo in cui si può finire con un array immutabile quando si pensava di averne uno mutabile è copiare un array mutabile. Ad esempio, si potrebbe avere una proprietà:

@property (copy) NSMutableArray *myArray; 

Forse quindi creare una matrice mutevole, aggiungere alcuni oggetti, e assegnarlo alla vostra proprietà:

NSMutableArray *tempArray = [NSMutableArray array]; 
[tempArray addObject:@"You say goodbye"]; 
[tempArray addObject:@"I say hello"]; 
self.myArray = tempArray; 

Ora, fa il punto tempArray ad un mutabile array o un array immutabile? Non l'ho provato di recente, ma sono abbastanza sicuro che tu abbia un array immutabile. Ottieni decisamente un immutableArray se dici:

NSMutableArray *foo = [tempArray copy]; 

Quindi, avviare alla ricerca di luoghi nel codice in cui viene riassegnato il puntatore array. Dopotutto, se il tuo puntatore puntava davvero su un array mutabile, sarebbe terribilmente difficile spiegare l'eccezione che stai ricevendo.

0

Ho avuto lo stesso problema, ed è stato a causa dell'uso del metodo di copia. Ne ho realizzato uno da solo restituendo un NSMutableArray * e ha funzionato.

Problemi correlati