Objective C では、C++ 言語と同じように、オブジェクトをオブジェクトに代入すると、次のようなポインティング アドレスが取得されます。
object1 = object2;
したがって、上記のオブジェクトの 1 つを変更すると、他のオブジェクトに影響します。
これは MutableCopy でも同じですか? copy と MutableCopy の違いは何ですか?
ディープコピーを行うには?
Objective C では、C++ 言語と同じように、オブジェクトをオブジェクトに代入すると、次のようなポインティング アドレスが取得されます。
object1 = object2;
したがって、上記のオブジェクトの 1 つを変更すると、他のオブジェクトに影響します。
これは MutableCopy でも同じですか? copy と MutableCopy の違いは何ですか?
ディープコピーを行うには?
にObjective C
は とは異なるメモリ管理モデルがあるC++
ため、単純に削除することはできませんfirstString
。それへの強い参照をすべて削除する必要があります。その場合、強い参照を作成します。再割り当てsecondString
すると、別のオブジェクトを指します。NSString
不変もそうです。
可変コピーは別の文字列オブジェクトを作成し、それを変更できます
はい、mutableCopy (およびコピー) はディープ コピーです。
次のテスト コードを参照してください。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSString *string1 = @"string1";
NSString *string2 = string1;
NSLog(@"Test 1(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
string1 = nil;
NSLog(@"Test 2(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
string1 = string2;
NSLog(@"Test 3(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
string2 = [string1 mutableCopy];
NSLog(@"Test 4(%p, %p): String 1: %@; String 2: %@", string1, string2, string1, string2);
}
次の出力が生成されます。string2 が string1 に割り当てられている場合、メモリの場所は同じであることがわかります。テスト 4 では、mutableCopy の後、メモリの場所が変更されます。
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 1(0x103021068, 0x103021068): String 1: string1; String 2: string1
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 2(0x0, 0x103021068): String 1: (null); String 2: string1
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 3(0x103021068, 0x103021068): String 1: string1; String 2: string1
2015-04-30 11:07:30.359 TestStuff[9425:2555886] Test 4(0x103021068, 0x7f9a23d71b30): String 1: string1; String 2: string1