2010-10-01 7 views
-1

Je suis en train de retourner un NSMutableArray mais j'eu cette erreur dans la console:erreur de retour dans NSMutableArray

2010-10-01 14: 12: 21,348 Répertoire [1424: a0f] + [ LinkedList getListArray]: sélecteur non reconnu envoyé à la classe 0x1000053e8

Le code de la méthode est la suivante:

- (id)getListArray { 
ListNode *tmp = iterator; 
iterator = head; 

NSMutableArray * list = [NSMutableArray arrayWithCapacity:self.getNSIntegerNum]; 

while ([iterator next] != nil) { 
    [list addObject:[iterator data]]; 
} 

iterator = tmp; 

return list; 

} 

et l'appel de méthode est:

contacts = [LinkedList getListArray];

"contacts" est un objet NSMutableArray déjà initialisé. Des idées?

+1

Vous avez clairement besoin d'acheter un livre sur Cocoa pour décoller. Si "contacts [vraiment] est un objet NSMutableArray déjà initialisé", vous venez d'avoir vous-même une fuite de mémoire ou une incompréhension majeure d'Objective-C. –

Répondre

3

Il semble que vous appeliez getListArray comme s'il s'agissait d'une méthode de classe, mais il est défini comme une méthode d'instance.

Vous devez définir getListArray en tant que méthode de classe (avec un + au lieu d'un - au début), ou créer une instance de LinkedList et appeler getListArray sur cela.

// Best guess code sample. 
LinkedList *myLinkedList = [[LinkedList alloc] init]; 
contacts = [myLinkedList getListArray]; 
[myLinkedList release]; 
+0

Je suis désolé, je n'ai pas collé de code là où la classe est instanciée. Dans mon code j'ai créé une instance comme vous l'avez fait. J'ai déjà des méthodes de travail dans cette classe. = S wierd. –

+0

@Leonardo Suzan: Peu importe si vous avez créé une instance - vous envoyez toujours 'getListArray' à la classe elle-même. C'est juste dans votre question: '[LinkedList getListArray]' - c'est un message à la classe, pas à une instance particulière. – Chuck

+0

Pouvez-vous poster le code où vous instanciez votre objet LinkedList? Je pense que cela aiderait énormément. –

0
contacts = [LinkedList getListArray]; 

contacts est un objet NSMutableArray déjà initialisé.

Ou c'était. Si le message était passé (c'est-à-dire si la classe LinkedList répondait à ce message ou si vous deviez l'envoyer à une instance LinkedList à la place), cette affectation remplacerait le tableau précédemment créé et stocké dans contacts avec le tableau créé et retourné par getListArray. Rappelez-vous: La variable contactsn'est pas un tableau. C'est un conteneur pour un pointeur vers un objet (tableau). Vous dites que vous avez précédemment créé un tableau, et stocké son pointeur dans cette variable; maintenant vous essayez d'obtenir un autre tableau et de stocker son pointeur dans cette variable, qui remplacera n'importe quel pointeur était là avant. La raison pour laquelle vous ne remplacez pas la baie contacts est la raison pour laquelle Robot K l'a signalé: Vous envoyez le message à la classe LinkedList, mais seules les instances de LinkedList répondent à ce message.

Il y a deux solutions à la fois la création d'un réseau redondant et l'exception:

  1. Renommer getListArray à getListArray:, et faire prendre un NSMutableArray comme paramètre et remplir ce tableau.
  2. Cessez de créer un tableau vide au préalable (inutile) et envoyez le message getListArray à une instance de LinkedList plutôt qu'à la classe LinkedList. La dernière partie est ce que Robot K a suggéré.

Je recommande la solution # 2.

Lorsque des personnes effectuent une erreur de création redondante d'un objet, elles fuient souvent l'objet redondant (one example); vous n'avez pas montré la création du tableau précédent, donc je ne peux pas voir si vous l'avez fait, donc, au cas où, je vous suggérerais également de lire ou de relire the Memory Management Programming Guide for Cocoa.

Questions connexes