在目标 C 中,与 C++ 语言相同,如果将对象分配给对象,它将获得其指向地址,如下所示:
object1 = object2;
因此,更改上述对象之一将影响另一个对象。
MutableCopy 也一样吗?复制和 MutableCopy 有什么区别?
如何做深拷贝?
在目标 C 中,与 C++ 语言相同,如果将对象分配给对象,它将获得其指向地址,如下所示:
object1 = object2;
因此,更改上述对象之一将影响另一个对象。
MutableCopy 也一样吗?复制和 MutableCopy 有什么区别?
如何做深拷贝?
inObjective C
与 in 有不同的内存管理模型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