2010-10-04 17 views
7

J'ai le code suivant qui génère cette erreur. Je ne peux pas comprendre pourquoi le message subarrayWithRange est envoyé à une chaîne? Quand c'est clairement un tableau?Sélecteur non reconnu envoyé à l'instance [NSCFString subarrayWithRange:]

static const int kItemsPerView = 20; 
NSRange rangeForView = NSMakeRange(page * kItemsPerView, kItemsPerView); 

NSMutableArray *temp = [[APP_DELEGATE keysArray] mutableCopyWithZone:NULL]; 
NSArray *itemsForView = [temp subarrayWithRange:rangeForView]; 

for (int loopCounter = 0;loopCounter < r*c;loopCounter++){ 
    NSLog(@"%i: %@ ", loopCounter, [itemsForView objectAtIndex:loopCounter]); 
} 

Erreur:

-[NSCFString subarrayWithRange:]: unrecognized selector sent to instance 0x6b071a0 
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: [NSCFString subarrayWithRange:]: 

Merci

Répondre

29

Ces types d'erreurs sont généralement liées à la gestion de la mémoire. Essentiellement, vous envoyez un message à une adresse qui est maintenant occupée par un autre objet parce que l'occupant précédent a disparu de façon inattendue. Puisque cet espace d'adressage peut être occupé par n'importe quoi, il vous arrive de demander à un NSCFString quelque chose auquel il ne répond pas.

Si vous mettez le débogueur en pause juste après avoir créé le tableau temporaire, que voyez-vous affecté à la température? Je suppose que quelque chose ne va pas avec quoi -keysArray revient. Vous pourriez vouloir vérifier comment la mémoire est traitée dans tout ce qui est censé revenir. Par le nom, je suppose que votre délégué d'application a un tableau appelé "keysArray" en tant que variable d'instance. Peut-être que ce n'est pas correctement conservé quand il est créé ou assigné?

+0

Après la création, 'temp' est un tableau de 80 chaînes, infobulle de débogage montre seulement 10 articles mais pas sûr que ce soit juste Xcode ou non? Vous avez corrigé keysArray est une variable d'instance dans mon App Delegate, une propriété définie comme (non atomic, retain), puis synthétisée et affectée à l'aide d'une méthode pratique 'arrayWithContentsOfFile'. Je n'ai pas besoin de le conserver manuellement, n'est-ce pas? – joec

+0

Oui. Vous ne l'avez pas créé, la méthode pratique l'a fait. Par conséquent, si vous voulez qu'il reste après sa création, vous devez implémenter une réclamation en conservant (ou en créer une copie). Jetez un autre regard sur les règles de gestion de la mémoire. –

+0

Si vous utilisez l'accesseur de propriété au lieu d'assigner, vous n'aurez pas besoin de retenir; ou, vous pouvez appeler '[[NSArray alloc] initWithContentsOfFile: @" un chemin "]' à la place. – jlehr

4

Donc, j'ai eu celui-ci. J'ai fait quelque chose de stupide. J'ai assigné UITextView à une chaîne au lieu de sa propriété text. à savoir:

myObj.txtbxThing = [NSString stringWithFormat:@"%@", stuffString]; 

au lieu de:

myObj.txtbxThing.text = [NSString stringWithFormat:@"%@", stuffString]; 
+0

J'ai fait quelque chose d'aussi stupide. J'ai assigné un NSString à un NSURL * et * en quelque sorte raté l'avertissement du compilateur à ce sujet. –