2014-04-23 56 views
2

我有2类作为每下面:分配值到一个只读对象的属性

类ModelA.h

@interface ModelA : NSObject 
    @property (nonatomic, strong) NSArray *arrayA; 
@end 

类ControllerA.m

@interface ControllerA() 
    @ property (nonatomic, copy, readonly) ModelA *modelProperty; 
@end 

@implementation ControllerA 

- (void)someMethod:(NSArray *)sampleArray 
{ 
    self.modelProperty.arrayA = sampleArray; 
} 

如果我t ry给self.modelProperty分配一些东西,我得到一个构建错误,说我不能,因为它只是一个只读属性。但是我给它的属性指定了一些东西,XCode并没有给出任何错误,即self.modelProperty.arrayA = sampleArray只是建立好了。但是,当我通过它进行调试并打印self.modelProperty.arrayA即使sampleArray中有数据,我也会得到零。

问题:是否可以为readonly对象的属性赋值?

+2

你在做什么是完全没问题的。但是,如果'self.modelProperty'为'nil',你会看到你得到的结果。确保'modelProperty'有一个值。仅供参考,以私有财产为只读是不寻常的。通常情况下,你会让公共属性为只读,然后在类扩展中进行读写,以便课程可以使用它。 – rmaddy

+0

是的,你们都是对的。我分配了一些东西给modelProperty并且工作。谢谢!!! –

回答

1

是否可以将值分配给readonly对象的属性?

呃,有点。你使用的语言有点混乱。它不是只读对象;这是一个只读属性。并且可以将值分配给存储在只读属性中的对象。

readonly只是表示您不能设置该属性 - 没有setModelProperty:设置方法。

不是表示该对象的目标是不可变的。这与const不类似。这意味着你不能设置属性。

你看到nil的原因是发送到nil回报nil的任何消息。

self.modelProperty.arrayA 

是一样的:

[[self modelProperty] arrayA] 

如果modelPropertynil(这是从你所示的代码),这是一样的:

[nil arrayA] 

返回nil - 与[nil anyMethod]返回nil相同。


最后一点:你有copy集作为modelProperty财产内存政策,但ModalA类没有出现实现NSCopying协议。你确定你不想要strong

+0

是的,我希望它是复制。我将实施NSCopying协议。感谢您解释只读属性。在为modelProperty分配一些东西后,这个工作。谢谢!! –

+0

@techie_woman你能把这个标记为答案吗?谢谢。 –

0

Try:_modelProperty = sampleArray