0

プログラムの一部は、uitextfield からテキストを取得し、それを変更可能な文字列にコピーしてから実行します。

     sharedManager.ce_name=name.text


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

この時点で、常に「不変オブジェクトを変更しようとしている」というメッセージが表示されました-ランダムではありませんでした

初めてこのエラーが発生したとき、次のように変更しました

    sharedManager.ce_name=(NSMutableString *)name.text

これにより、不変オブジェクトのエラーを変更しようとする試みが行われましたが、ランダムに発生します - 変ですよね?

私はそれをに変更しました

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

    sharedManager.ce_name=mutable_name;

この方法でまだ失敗したことはありませんが、解決策が見つからなかったと確信しています。

私の質問:

1)最初の修正後にランダムに実行していたという事実は、メモリ管理に深刻な問題があることを示している可能性がありますか?

2) C スタイルのキャストで修正されなかったのはなぜですか?

3) 現在の修正は機能しますか?

御時間ありがとうございます :)

4

3 に答える 3

4

ここでの問題は、キャストの使用方法です。ポインターをキャストすると、その場所のメモリがその型を表すデータのブロックであるかのように扱われ始めます。

したがって、Car クラスへのポインター Car* mycar; を取得し、それを Person オブジェクト (Person*)mycar; にキャストすると、プログラムは、あたかもそれがポインターを指しているかのように、そこにあるメモリーにアクセスしようとします。人物オブジェクト。ただし、古いテレビのホームコメディを除いて、車は人ではないため、これでメンバーにアクセスしようとしたり、関数を呼び出したりしようとすると、予期していたものとは異なる未定義のものを含むメモリの場所に移動しようとします。事が起こります (通常、クラッシュ)。

NSMutableString と NSString はこの点で互換性がないため、一方から他方へのキャストはひどい結果になります。あなたの修正 ([NSMutableString stringWithString:]) は正しい解決策です。

于 2011-08-30T18:51:58.540 に答える
2
  1. ランダムに実行していた場合、name.text が変更可能な文字列である場合もあれば、不変の文字列である場合もあったことを意味します。

  2. そのようなオブジェクト間のキャストは、オブジェクトのクラスを変更しません。不変オブジェクトを可変にすることはできません。

  3. その「修正」はおそらくそれを行うための最良の方法です(少なくとも、あなたが示しているコードで私が見ることができるものから)

于 2011-08-30T18:43:14.133 に答える
2

少なくとも関連する変数の宣言を見ないと、確実に言うのは難しいですが、最終的な解決策である新しい可変文字列を作成することは、おそらく正しい修正です。ご質問については、

  1. メモリ管理自体ではありませんが、おそらくどこかにあるはずのないものを上書きしていたのでしょう。
  2. キャストは、オブジェクトの基本型を変更できません。(おそらく) NSString があり、世界中のすべてのキャストがそれを NSMutableString にすることはできません。
  3. 私が言ったように、おそらくですが、確認するにはさらにコードを確認する必要があります. それは確かにはるかに良い修正です。
于 2011-08-30T18:44:20.210 に答える