2

在我的子视图控制器中,我有一个属性定义为:

@property (nonatomic, copy) NSString *name;

在视图控制器 A(父级)中,我有以下内容:

NSString *temp = currency.name; //This is because currency is a Core Data Managed Object.
                                //I wanted to make sure it wasn't a confounding factor.

childViewController.name = temp;

if(childViewController.name == temp)
  NSLog(@"I am surprised");

问题是该if语句找到等效性并且打印了“我很惊讶”。我认为==应该检查它们是否是同一个对象,并且copy在属性声明中使用 of 应该确保 setter 正在制作副本。我检查了调试器,它们都指向同一个字符串。(我认为这是不可变的,这可能就是为什么会发生这种情况?)

即使我写作也会发生同样的事情childViewController.name = [temp copy];,这让我感到震惊!

谁能解释这里发生了什么?

编辑:我在这里删除了一些担心循环引用的问题,我意识到这不是问题。

4

1 回答 1

0

这是一个优化。

对于不可变对象,创建实际副本是多余的,因此- copy通常实现为简单的保留,即

- (id)copy
{
    [self retain];
    return self;
}

尝试为属性分配一个可变对象(例如NSMutableString),您将获得“预期”的行为。

于 2013-10-28T05:44:48.467 回答