关于'复制'和'保留'的详细信息

时间:2014-09-29 11:08:21

标签: objective-c copy retain

我正在研究“复制”与“复制”之间的差异。并且'保留'在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

非常感谢任何帮助或建议。

2 个答案:

答案 0 :(得分:0)

我相信你看到了NSString的不变性。 This answer记下了在堆栈上分配时具有相同地址的两个单独NSString个对象的示例。我假设copyretain只是为不可变值返回self,因为它们永远不会改变。

答案 1 :(得分:0)

copy并不一定会给你一个新对象。不可变类可以选择通过为您提供相同的对象来实现它。您不应该关心它是否是同一个对象。