我正在研究“复制”与“复制”之间的差异。并且'保留'在Objective-c中。但是,我有一些疑问,为什么要复制'方法不会打开新的内存地址?
NSString *aString = [NSString stringWithFormat:@"Hello, World !"];
NSLog(@"%p, %@", aString, aString);
NSString *bString = [aString copy];
NSLog(@"%p, %@", bString, bString);
NSString *cString = [aString retain];
NSLog(@"%p, %@", cString, cString);
[aString release];
[bString release];
[cString release];
结果显示如下:
2014-09-29 17:30:52.730 SEL_Demo[987:303] 0x100301030, Hello, World !
2014-09-29 17:30:52.731 SEL_Demo[987:303] 0x100301030, Hello, World !
2014-09-29 17:30:52.731 SEL_Demo[987:303] 0x100301030, Hello, World !
但是,我创建了一个名为Person的新类,并用以下方法实现了委托:
- (id) copyWithZone:(NSZone *)zone
{
return [[[self class] allocWithZone:zone] init];
}
然后,在主文件中:
Person *person = [[Person alloc] init];
NSLog(@"%p",person);
Person *aPerson = [person copy];
NSLog(@"%p", aPerson);
Person *bPerson = [person retain];
NSLog(@"%p", bPerson);
然后,我得到了不同的结果如下所示:
2014-09-29 19:02:50.248 SEL_Demo[1133:303] 0x10010a860
2014-09-29 19:02:50.250 SEL_Demo[1133:303] 0x1003007f0 //different memory address.
2014-09-29 19:02:50.250 SEL_Demo[1133:303] 0x10010a860
非常感谢任何帮助或建议。
答案 0 :(得分:0)
我相信你看到了NSString
的不变性。 This answer记下了在堆栈上分配时具有相同地址的两个单独NSString
个对象的示例。我假设copy
和retain
只是为不可变值返回self
,因为它们永远不会改变。
答案 1 :(得分:0)
copy
并不一定会给你一个新对象。不可变类可以选择通过为您提供相同的对象来实现它。您不应该关心它是否是同一个对象。