我有一个readonly
对象属性:
@property (readonly) MyCustomController* customController;
MyCustomerController
有一个名为myCustomProperty
可以在readonly
对象上设置属性吗?
self.customController.myCustomProperty = [CustomProperty new];
编译器没有抱怨,并且在运行时功能似乎很好 - 我可以在readonly
对象上设置属性似乎有点奇怪?
虽然从技术上来说我想我是"阅读"属性,然后在其上设置属性,所以我在技术上没有设置实际的readonly
属性指针。
这样做不好吗?可能出问题吗?
根据Rypress:
readonly属性是一种将属性设置为只读的简单方法。它 省略了setter方法并通过点符号来阻止赋值,但是 吸气剂不受影响。举个例子,让我们改变我们的汽车 接口如下。请注意如何指定多个 用逗号分隔它们的属性。
所以看起来它不是一个问题,我只想仔细检查
答案 0 :(得分:3)
虽然从技术上来说我想我正在“读取”属性,然后在其上设置属性,所以我在技术上并没有设置实际的只读属性指针。
完全。它不是只读对象,而是存储对象引用的属性。您无法更改属性引用的对象,但您可以调用该对象上的方法和属性来改变其状态。
你所做的是完全正确和正常的。
答案 1 :(得分:1)
记住"点语法"是有帮助的。对于属性访问来说,只是用于调用访问器方法的语法糖。所以,你的陈述:
self.customController.myCustomProperty = [CustomProperty new];
(假设访问者名称尚未定制)字面上相当于:
[[self customController] setMyCustomProperty:[CustomProperty new]];
请注意,您只是为customController
属性调用getter。所有readonly
属性都意味着属性:那里有一个getter但没有setter。当然,召唤吸气剂是完全没问题的。除了声明其类型之外,该属性不会影响您对检索值的处理。
无论哪种形式,您都可以将其分解为两个单独的步骤:
MyCustomController* controller = self.customController;
controller.myCustomProperty = [CustomProperty new];
请注意,customController
属性仅涉及这些行中的第一行。第二个仅受controller
属于MyCustomController*
类型和myCustomProperty
的(未显示)声明的影响。
想想另一个案例:
// Some method on some class:
- (void) doStuffWithCustomController:(MyCustomController*)controller;
// Your code, in a completely different class:
[foo doStuffWithCustomController:self.controller];
当然,您认为-doStuffWithCustomController:
可以对controller
参数执行任何对MyCustomController
引用有效的参数,但这并不重要参考来自。对?因此,它可以毫无顾虑地分配给controller.myCustomProperty
。好吧,你也可以。