2016-11-18 21 views
0

我有一个readonly对象属性:是不是还好只读对象上设置的属性在Objective-C

@property (readonly) MyCustomController* customController; 

MyCustomerController有一个叫myCustomProperty

属性是它好设置的属性readonly对象?

self.customController.myCustomProperty = [CustomProperty new]; 

编译器不抱怨,并在运行时的功能似乎是fine--它只是似乎有点不可思议,我可以设置一个readonly对象的属性?
虽然技术上我猜我是“读”属性,然后设置属性,所以我在技术上不设置实际的readonly属性指针。

这是不好的做法吗?任何事情都可能出错?

根据Rypress

只读属性是一个简单的方法,使属性只读。它 省略了setter方法,并通过点符号防止分配,但是 getter不受影响。例如,让我们将我们的Car 界面更改为以下内容。请注意,您可以通过用逗号分隔多个属性来指定多个 属性。

所以现在看来​​似乎不是一个问题,我只是想仔细检查

回答

3

虽然技术上我想我“读书”的属性,然后设置它的属性,所以我在技术上不设置实际的只读属性指针。

没错。它不是只读的对象,而是存储对象引用的属性。您无法更改属性引用的对象,但您可以调用该对象上的方法和属性来更改其状态。

你在做什么是完全正确和正常的。

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:可以做它接收到任何的有效期为MyCustomController参考controller参数并不要紧,该基准是从哪里来的。对?所以,它可以分配给controller.myCustomProperty而不用担心。那么,你也可以。

相关问题