视图控制器之间的NSString的内存地址混淆

时间:2013-10-28 05:36:17

标签: ios properties automatic-ref-counting viewcontroller setter

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

@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应该确保setter正在制作副本。我检查了调试器,他们都指向相同的字符串。 (我认为这是不可改变的,这可能就是为什么会发生这种情况的原因?)

即使我写childViewController.name = [temp copy];,也会发生同样的事情,我觉得这很令人震惊!

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

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

1 个答案:

答案 0 :(得分:0)

这是一项优化。

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

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

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