是否可以在Objective-C中的只读对象上设置属性

时间:2016-11-18 19:01:02

标签: objective-c

我有一个readonly对象属性:

@property (readonly) MyCustomController* customController;

MyCustomerController有一个名为myCustomProperty

的属性

可以在readonly对象上设置属性吗?

self.customController.myCustomProperty = [CustomProperty new];

编译器没有抱怨,并且在运行时功能似乎很好 - 我可以在readonly对象上设置属性似乎有点奇怪?
虽然从技术上来说我想我是"阅读"属性,然后在其上设置属性,所以我在技术上没有设置实际的readonly属性指针。

这样做不好吗?可能出问题吗?

根据Rypress

  

readonly属性是一种将属性设置为只读的简单方法。它   省略了setter方法并通过点符号来阻止赋值,但是   吸气剂不受影响。举个例子,让我们改变我们的汽车   接口如下。请注意如何指定多个   用逗号分隔它们的属性。

所以看起来它不是一个问题,我只想仔细检查

2 个答案:

答案 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。好吧,你也可以。