在我的子视图控制器中,我有一个属性定义为:
@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];
,也会发生同样的事情,我觉得这很令人震惊!
有谁能解释这里发生了什么?
编辑:我在这里删除了一点担心循环引用,我意识到这不是一个问题。
答案 0 :(得分:0)
这是一项优化。
对于不可变对象,创建实际副本是多余的,因此- copy
通常实现为简单的保留,i。即
- (id)copy
{
[self retain];
return self;
}
尝试将可变对象(例如NSMutableString
)分配给该属性,您将获得“预期”行为。