我的NSArrayController内容即使只是readonly也会更改?

时间:2011-12-28 11:39:16

标签: objective-c cocoa

我的NSArrayController是只读

@property (readonly) NSArrayController *rootObjectsArrayController;

但其内容无论如何都会改变

[[aClass rootObjectsArrayController] setContent:contentArray];

它有效。为什么?

3 个答案:

答案 0 :(得分:2)

只读属性定义只是意味着您无法设置该属性 - 例如,您无法通过生成的访问器方法将 new 数组控制器设置为rootObjectsArrayController。

但是,没有什么能阻止你修改从getter返回的对象。如果你有一个可变数组作为只读属性,这将是相同的 - 你可以通过属性访问它后向对象添加对象。

答案 1 :(得分:1)

属性为readonly的属性意味着只会生成(合成)read访问者,因此没有像setRootObjectsArrayController这样的setter,这并不意味着该对象只是readonly。

这就是为什么你仍然可以传递信息。

有关详细信息,请参阅Apple's ObjectiveC ref

答案 2 :(得分:0)

有很多方法可以看看这个,但对我有用的方法是:

readonly属性意味着您不能将另一个对象分配给该属性(除非您在幕后执行,但这是另一回事)。

但是,如果对象是可变对象,则可以要求对象更改其自己的内部

如果您想在实践中看到这一点,可以使用NSLog打印相关对象的地址:

NSArray *contentArray = [NSArray arrayWithObject: @"First array"];
NSArray *anotherContentArray = [NSArray arrayWithObject: @"Second array"];

[[aClass rootObjectsArrayController] setContent:contentArray];

NSLog(@"Controller address: %p, content array address: %p", [aClass rootObjectsArrayController], [[aClass rootObjectsArrayController] content]);

[[aClass rootObjectsArrayController] setContent:anotherContentArray];

NSLog(@"Controller address: %p, content array address: %p", [aClass rootObjectsArrayController], [[aClass rootObjectsArrayController] content]);

你可以在这里看到的是,控制器在两种情况下都具有相同的地址,因此在内容发生变化之后也是如此。因此它仍然是同一个实例。

当然,改变的是内容的地址,它是控制器对象的内部地址,并由setContent:消息修改。