4

文字列の使用法NSStringとの間で混乱しています。NSMutable次のようにクラスで宣言されたインスタンス変数 one と two があるとします。

NSString *one;
NSMutableString *two;

プロパティを使用してセッターとゲッターを作成したとします。

次のように「2」文字列を変更したとしましょう。

     1. [two appendString:@"more string"];
     2. two = @"string"
     3. self.two = @"string"

質問:

  1. 最初の行は前の文字列を解放し、新しいオブジェクトを割り当ててそれに値を割り当てます。はいの場合、この場合、ゲッターとセッターの作成は不要ですか? または、プロパティを作成する必要はありませんNSMutablestring

  2. この場合、以前に割り当てられた文字列オブジェクトは解放されますか?

  3. ここでセッターを呼び出しているため、最初のオブジェクトが解放されることは確実です。このコードは必要ですか、またはコード行 2 を使用して文字列を割り当てることができます。

今についてNSString:このように文字列を変更することもできます:

    one = [one stringByAppendingString:@" more string"];
    self.one = [one stringByAppendingString:@" more string"];

と のどちらを使用するのが良いですNSMutablestringNSString?

長い投稿で申し訳ありませんが、これらの概念を理解する必要がありました。

4

5 に答える 5

3

NSString は変更できない文字列オブジェクトです。つまり、初期化後に変更することはできません。NSMutableString は変更可能であるため、別の文字列を追加したり、その他の変更を加えたりすることができます。

すると[two appendString:@"more string"]、ポインターは引き続きメモリ内の同じ場所を指しているため、割り当てや割り当て解除について心配する必要はありません。

を行うtwo = @"string"と、文字列ポインターがメモリ内の特定の場所を指すようになり、内部に値「文字列」を持つ静的文字列が含まれます。

を実行するとself.two = @"string"、two という名前のプロパティが既に宣言されています。xcode でプロパティを使用すると、プロパティ宣言で既に指定されているため、メモリについて心配する必要はありません。これは xcode が提供する優れたツールであり、できる限り使用する必要があります。

于 2012-06-15T18:51:17.907 に答える
3

質問の最初の部分について:

  1. ほとんど間違いありません。メモリが解放されて再割り当てされるのではなく、動的に割り当てられることを期待しています。

  2. 前の答えがノーなら、これもノーです。

  3. 2番目と3番目のオプションは、警告でも機能しませんIncompatible pointer types assigning NSMutableString to NSString

NSMutableStringプログラムが動的にメモリを必要とする可能性があることを早い段階で示しているため、メモリの点で少し効率的になると思います。NSString適切なサイズのメモリ ブロックが 1 つ割り当てられる可能性があります。

あなたの見解は、 NSString のメソッドが行うことのNSMutableStringようstringBy..です:

NSStringとそのメソッドを使用しstringBy...て、新しいオブジェクトを作成し、古いオブジェクトを解放し (必要な場合)、新しいオブジェクトを自動解放します。(非自動リリースから自動リリースに変更する場合は注意してください。dealloc に不要になったリリースがある可能性があります)

于 2012-06-15T11:23:30.587 に答える
2

NSMutableStringNSStringオブジェクトは常に定数であるため、メモリを節約できます。したがって、NSString変数に新しい値を再割り当てすると、新しい文字列に新しいメモリが割り当てられます。

ただし、コード内のいくつかのエラーに注意してください。メッセージを送信する前に、オブジェクトを初期化する必要があります。

// this won't work
NSString *one; 
[one stringByAppendingString:@"more string"];

// nor this
NSMutableString *two;
[two appendString:@"more string"];

// first do this: 
NSString *one = @"an initial string constant"; // or
NSString *one = [NSString string]; 

NSMutableString *two = [NSMutableString string]; 
于 2012-06-15T11:36:20.640 に答える
2

NSStringオブジェクトは不変です。つまり、a を「変更」するとNSString、実際には新しい文字列が作成され、古い文字列は変更されず、あまり効果的ではありません。NSMutableString文字列は変更可能なバッファに保持されます。

したがって、簡単なルールは、何らかの方法で文字列を変更する必要がある場合は、NSMutableStringおよび if not を使用することNSStringです。NSMutableStringaを a にキャストすることもできますがNSString、その逆はできません (コピーを作成する必要があります)。

于 2012-06-15T11:46:43.817 に答える
0

NSMutableString と NSString の違いは次のとおりです。

NSMutableString: NSMutableString オブジェクトは、それらが表す文字の基になる配列を変更するメソッドを提供しますが、NSString は提供しません。たとえば、NSMutableString は、appendString、deleteCharactersInRange、insertString、replaceOccurencesWithString などのメソッドを公開します。これらのメソッドはすべて、メモリ内に存在する文字列を操作します。実行時に文字列オブジェクトの値を変更できます。

NSString: 一方、必要に応じて、作成後は読み取り専用の文字列のみです。すべての「操作」メソッド (substring、uppercaseString など) は他の NSString オブジェクトを返し、メモリ内の既存の文字列を実際に変更することはありません。

于 2013-09-07T09:15:17.970 に答える