2011-08-30 2 views
0

Une partie du programme prend le texte d'un UITextField, copie dans une chaîne mutable et exécute ensuitetentative de muter objet immuable jeté au hasard

 sharedManager.ce_name=name.text 


    [sharedManager.ce_name replaceOccurrencesOfString:@" " withString:@"%20" 
    options:NSLiteralSearch range:NSMakeRange(0, [sharedManager.ce_name length])]; 

A ce stade, il m'a toujours donné « tentative de muter objet immuable "- il n'a pas été au hasard

la première fois que je suis arrivé cette erreur je l'ai changé

sharedManager.ce_name=(NSMutableString *)name.text 

ce STILL m'a donné la tentative de muter erreur d'objet immuable, mais je t se produirait au hasard - bizarre non?

je puis changé à

NSMutableString *mutable_name = [NSMutableString stringWithString:name.text]; 

    sharedManager.ce_name=mutable_name; 

Il n'a pas encore d'échouer sur moi ce faire de cette façon, mais je suis convaincu que je ne l'ai pas trouvé la solution.

mes questions:

1) pourrait-il fait qu'il le faisait au hasard après la première correction indique que j'ai un problème de gestion de la mémoire profonde?

2) Pourquoi la fonte de style C ne l'a-t-elle pas corrigée?

3) Mon correctif actuel fonctionnera-t-il?

Merci pour votre temps :)

Répondre

4

Le problème ici est la manière dont vous utilisez le casting. Lorsque vous lancez un pointeur, il commence simplement à traiter la mémoire à cet emplacement comme s'il s'agissait d'un bloc de données représentant ce type. Donc, si j'ai un pointeur vers une classe Car: Car * mycar ;, et que je le lance vers un objet Person: (Person *) mycar ;, le programme essayera d'y accéder comme s'il pointait sur un objet Personne.Cependant, une voiture n'est pas une personne, sauf dans une vieille sitcom télévisée, donc quand elle essaie d'accéder à des membres ou à des fonctions d'appel, elle essaie d'aller dans un emplacement mémoire qui contient autre chose que ce qu'elle attend, et indéfini les choses arrivent (généralement, s'écraser). NSMutableString et NSString sont incompatibles à cet égard, et ainsi la conversion de l'un à l'autre se traduira par des temps terribles.

Votre correctif ([NSMutableString stringWithString:]) est la solution correcte.

+0

Merveilleux! Merci d'avoir résolu mon problème. La chose que j'apprécie le plus, cependant, c'est le fait que vous avez expliqué ce que le casting fait vraiment. Je n'avais jamais pensé à ça comme ça :) –

2
  1. Si elle le faisait au hasard, cela signifie que name.text était parfois une chaîne mutable et quelques fois une chaîne de immuable.

  2. La diffusion entre objets de ce type ne modifie pas la classe de l'objet. Cela ne rendra pas votre objet immuable mutable.

  3. Cette « solution » est probablement la meilleure façon de le faire (au moins de ce que je peux voir dans le code que vous montrez)

2

Sans voir au moins les déclarations des variables impliquées, Il est difficile de le dire avec certitude, mais votre solution finale, en créant une nouvelle chaîne mutable est probablement la solution correcte. Quant à vos questions,

  1. Non gestion de la mémoire en tant que tel, mais il a été probablement quelque chose qu'il écrasant ne devrait pas avoir quelque part.
  2. Les lancers ne peuvent pas modifier le type fondamental d'un objet. Vous aviez (probablement) un NSString et tout le casting dans le monde ne peut pas en faire un NSMutableString.
  3. Comme je l'ai dit, probablement, mais nous aurions besoin de voir plus de code pour être sûr. C'est certainement une bien meilleure solution.
+0

Alors attendez, si sharedManager.ce_name est une chaîne NSMutable alors: sharedManager.ce_name = (NSMutableString *) name.text ne fera pas sharedManager.ce_name tenir une chaîne immuable? –

+0

Ce nom doit être modifiable ou il ne devrait pas vous avoir permis de le compiler. Le nom est un UITextField, n'est-ce pas? Ensuite, name.text est un NSString, pas mutable, donc en le convertissant en une chaîne mutable, vous dites juste à obj-c de chercher dans tous les mauvais endroits pour les méthodes. Ma conjecture est que vous obteniez l'erreur si et seulement s'il y avait réellement un espace dans le texte, sinon cela n'essaierait pas de le changer pour que vous n'obteniez pas l'erreur. – Kevin