2011-07-05 3 views
-1

J'essaie de passer un objet NSMutableDictionary entre deux classes. J'ai essayé d'ajouter une méthode qui retourne un dictionnaire en vain.NSDictionary passer entre classes

-(NSMutableDictionary*) getResponse 
{ 
return response; //where response is a dictionary that has keys and objects assigned 
} 

mais même alors, le dictionnaire ne peut pas être extrait de l'autre classe; il renvoie "null".

+0

Il n'y a rien de mal avec votre exemple ... Si 'response' est défini dans votre classe, cela le retournera. Assurez-vous que l'autre classe le conserve! –

+3

Il y a une chose qui ne va pas: Son nom. Il devrait simplement être «réponse» pour se conformer aux conventions de nommage de Cocoa. Un sélecteur qui commence par 'get' devrait se terminer par un deux-points, et l'argument devrait être un pointeur sur lequel stocker la valeur obtenue (return-by-reference). Cette méthode est correcte telle qu'elle est, mais devrait être nommée simplement 'response'. –

Répondre

2

J'ai essayé d'ajouter une méthode qui retourne elle-même en vain.

-(NSMutableDictionary*) getResponse 
{ 
return response; 
} 

C'est parce que cette méthode renvoie un dictionnaire. Pour que la méthode retourne elle-même, il faudrait demander à l'objet self son implémentation pour le sélecteur de la méthode, ou demander à l'exécution Objective-C de retourner la structure Method.

Mais ce n'est pas ce que vous voulez vraiment faire, n'est-ce pas?

Si vous voulez que cette méthode retourne le dictionnaire de réponse, eh bien, c'est exactement ce qu'il fait. C'est correct comme écrit (mis à part son nom, comme je l'ai déjà expliqué dans mon commentaire sur la question).

... mais même alors, les données ne peuvent pas être extraites de l'autre classe;

La méthode ne prétend pas renvoyer un objet de données; il prétend retourner un objet dictionnaire. Si cela renvoyait un objet de données, ce serait un bug.

... elle renvoie un caractère vide.

Non, il renvoie NSMutableDictionary *. void est un type; cela n'a de sens dans aucun autre contexte.

Si vous vouliez dire qu'il renvoie nil (le pointeur sur aucun objet), cela signifie que vous n'avez pas de dictionnaire de réponse à retourner. Ne demandez pas cet objet pour la réponse jusqu'à ce qu'il en ait un. Vous voudrez peut-être faire de l'objet qui veut la réponse le délégué de l'objet qui contient la réponse, et demander au porteur de la réponse d'envoyer un message à son délégué quand la réponse arrive. Vous pouvez même inclure la réponse dans ce message; l'alternative serait que le porteur de la réponse ne passe que lui-même, et le délégué demande au porteur de la réponse le dictionnaire de réponse dans son implémentation de la méthode déléguée.

Plus d'informations:

+0

J'ai édité ma question pour avoir plus de sens. Pour une raison quelconque, la variable ne semble pas être retenue. Je vérifierai mon code. Merci. – Baub

+0

@ James Martinez: Il n'y a aucune raison dans votre code pourquoi il serait retenu. Vous ne le conservez pas dans cet accès, il ne sera donc conservé que si l'appelant le conserve. Si vous faites référence à la propriété d'origine du dictionnaire dans 'response', le getter n'est pas l'endroit où chercher: Regardez dans le setter, ou l'affectation d'origine à la variable ou à la propriété. Notez que l'affectation à une variable et l'affectation à une propriété sont très différentes, comme indiqué dans la documentation du langage Objective-C. –

0

Si votre méthode renvoie zéro, c'est parce que votre variable response est nulle. Il n'est probablement pas initialisé à ce stade. Essayez de faire NSLog(@"Response: %@", response); dans la méthode getResponse. Vérifiez si la console imprime (null) ou un objet NSMutableDictionary valide.

+0

Il imprime null, mais il devrait déjà contenir des informations comme il a été précédemment déclaré et utilisé. – Baub

+1

Signifie que la variable n'a jamais été définie. La rétention de la mémoire n'est pas le problème ici. Votre init/setter n'a pas été appelé avant d'exécuter cette méthode. Ou, vous l'exécutez sur un nouvel objet, au lieu de celui qui a été initié. – David

+0

J'ai joint mon code ici: http://stackoverflow.com/questions/6599955/cant-send-nsmutabledictionary-to-another-class – Baub