我的NSArrayController是只读
@property (readonly) NSArrayController *rootObjectsArrayController;
但其内容无论如何都会改变
[[aClass rootObjectsArrayController] setContent:contentArray];
它有效。为什么?
答案 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:
消息修改。