2016-05-05 12 views
1

私はNSMutableStringのオブジェクトを作成しているときに2つの別々のメモリ位置を指しているのですが、NSStringを使用しているときは同じ位置を指しています。誰でもこの背後にある論理を説明できますか?NSStringとNSMutableStringのメモリ割り当て

NSMutableString *myString1 = [NSMutableString new]; 
NSMutableString *myString2 = [NSMutableString new]; 
NSLog(@"%p",myString1);0x00007fe572416da0 
NSLog(@"%p",myString2);0x00007fe5724114a0 

NSString *myString3 = [NSString new]; 
NSString *myString4 = [NSString new]; 
NSLog(@"%p",myString3);0x10622e470 
NSLog(@"%p",myString4);0x10622e470 
+0

これは重複しています。コードが間違っていて、フォーマットされていません。 – Avi

+0

申し訳ありません私はここで新しいです。あなたはリンクを共有していただけますか? –

+1

私は、2つ目の例が両方のポインタに同じ値を出力するとは信じられません。 – Avi

答えて

1

私が使用しているメモリに基づいて、それを説明します。私はそれが文字列定数として検討している後者の場合には

NSMutableString *myString1 = [NSMutableString new]; 

NSLog(@"String Retain Count: %lu", (unsigned long)[myString1 retainCount]); //String Retain Count: 1 

NSString *myString3 = [NSString new]; 

NSLog(@"String Retain Count: %lu", (unsigned long)[myString3 retainCount]); //String Retain Count: 18446744073709551615 

だから、非ARCのシナリオの下で、これらの変数の数を保持に関する詳細を与え下回ります。あなたの文字列をNSConstantStringと見なします。

0
  1. NSStringは不変であるため、クラスの実装では、可能な限り同一のインスタンスを返すようにしよう。
  2. NSMutableStringを作成しているため、2つ目の例が間違っています。また、ログ・ステートメントは異なる値を出力します。
+0

申し訳 NSStringの* myString1 = [新しいNSStringの]。 NSString * myString2 = [NSString new]; NSLog(@ "%p"、myString1); 0x10622e470 NSLog(@ "%p"、myString2); 0x10622e470 –

0

Objective-Cは、同じ内容の2つの不変オブジェクトを作成しようとすると、まったく同じオブジェクトを自由に使用できます。これは単なる一例です。例えば、[NSNull null]、@YES、@NO、短い不変文字列、空の配列、同じNSNumberなどに拡張されます。

1

文字割り当ては、すべてのオブジェクト割り当てと同様に、時間とメモリの両方で高価です。ランタイムは、文字列リテラルをインスタンス化しながらパフォーマンスを向上させ、メモリオーバーヘッドを減らすためにいくつかのトリッキーを行います。実行時に作成されたStringオブジェクトの数を減らすために、NSStringクラスは文字列のプールを保持します。コードが文字列リテラルを作成するたびに、ランタイムは文字列リテラルプールを最初にチェックします。文字列がプール内にすでに存在する場合、プールされたインスタンスへの参照が返されます。文字列がプール内に存在しない場合、新しいStringオブジェクトがインスタンス化され、プール内に配置されます。 Objective-Cは文字列が不変であり、データ破損の恐れなしに共有できるので、この最適化を行うことができます。あなたの2番目のコードブロックで

NSString *myString1 = [NSString new]; 
NSString *myString2 = [NSString new]; 

両方の文字列が空の文字列に初期化されています。したがって、それらは文字列プールからそれらの文字列の同じ参照を返します。

NSMutableStringこのようには機能しません。これらの文字列は変更可能であり、文字列が変更可能な場合は常にデータ破損の恐れがあるため、ランタイムはプールを作成しません。そして、あなたは異なった参照が印刷されるのを見ます。この例の外に取る

ポイントを使用すると、文字列がパフォーマンス上の理由、すなわち、不変を変更したくない場合は、常にNSStringを使用することです。文字列の可変バージョンが必要な場合にのみNSMutableStringに変更してください。

+0

ここでJVMとは何ですか? – Avi

+0

私はJavaの文脈でこの質問に答えるのに慣れています。習慣から出てきた:\ Edited – avismara

+1

2番目の例はあなたとOPが間違っています。人々が実際に試したコードを投稿しないときに起こります。 (実際に投稿されたコードを試してみてください) – Avi

0
NSString *firstUserName = @"nick"; 

NSString *secondUserName = @"nick"; 


if (firstUserName == secondUserName) 
{ 
    NSLog(@"areEqual"); 
} 
else 
{ 
    NSLog(@"areNotEqual"); 
} 

は、それの出力は、areEqual驚くべきことですか?

比較ポインタ値は、彼らが同じオブジェクトを指しているかどうかのチェックに相当:なぜ

がここにあります。それらが実際に全く同じオブジェクトを指している場合にのみ(異なるオブジェクトへのポインタのに対し、オブジェクトは、それらが同じ値を有するように指していても、同じ値を持っていない)場合にポインタが同じ値を有することになります。

関連する問題