【问题标题】:Assigning value to a property of a readonly object为只读对象的属性赋值
【发布时间】:2014-04-23 15:28:50
【问题描述】:

我有 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;
}

如果我尝试为 self.modelProperty 分配一些东西,我会收到一个构建错误,说我不能,因为它是一个只读属性。但是我为它的属性分配了一些东西,它 XCode 没有给出任何错误,即self.modelProperty.arrayA = sampleArray 构建得很好。但是,当我调试它并打印 self.modelProperty.arrayA 时,即使 sampleArray 中有数据,我也会得到 nil。

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

【问题讨论】:

  • 您所做的一切都很好。但是,如果self.modelPropertynil,您将看到您得到的结果。确保 modelProperty 有一个值。仅供参考,将私有属性设置为只读有点不寻常。通常,您会将公共属性设为只读,然后在类扩展中将其设为可读写,以便类可以使用它。
  • 是的,你们都是对的。我为 modelProperty 分配了一些东西并且可以工作。谢谢!!!

标签: ios objective-c readonly


【解决方案1】:

是否可以为只读对象的属性赋值?

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

readonly 只是意味着您不能设置该属性——没有setModelProperty: 设置方法。

意味着对象的目标是不可变的。它与const 不同。这意味着你不能设置属性。

您看到nil 的原因是发送到nil 的任何消息都会返回nil

self.modelProperty.arrayA

等同于:

[[self modelProperty] arrayA]

如果modelPropertynil(根据您显示的代码,它就是这样),这与:

[nil arrayA]

返回 nil -- 与 [nil anyMethod] 返回 nil 的方式相同。


最后说明:您已将copy 设置为modelProperty 属性的内存策略,但ModalA 类未出现实现NSCopying 协议。你确定不想要strong

【讨论】:

  • 是的,我希望它是副本。我将实施 NSCopying 协议。感谢您解释只读属性。在将某些东西分配给 modelProperty 之后,它就可以工作了。谢谢!!
【解决方案2】:

试试:_modelProperty = sampleArray

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-17
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 2014-12-01
    • 2016-05-07
    相关资源
    最近更新 更多