【问题标题】:NSMutableArray as @property with readonlyNSMutableArray 作为@property 只读
【发布时间】:2009-03-21 00:01:45
【问题描述】:

假设我有这样的事情:

@property (readonly) NSMutableArray *someArray;

即使@property 设置为只读,我可以修改 [obj someArray] 吗?

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    是的,您可以修改其内容。 readonly 仅适用于指针本身 - 这样,它 像 C++ 的 const

    基本上,说“只读”只是意味着“不要将a.someArray = foo 翻译成[a setSomeArray:foo]”。也就是说,不会创建任何 setter。

    (当然,如果您想防止修改,您只需使用NSArray。)

    【讨论】:

    • 你的意思是 C 的“const”。关于 C 的快速要点......这取决于“const”在星号的哪一侧。这里的只读属性就像 NSMutableArray * const someArray;但不像 const NSMutableArray *someArray; en.wikipedia.org/wiki/Const-correctness
    【解决方案2】:

    someArray 的内容是可修改的,尽管属性不是(即调用不能通过分配给属性来更改 someArray 实例变量的值)。请注意,这与 C++ 的 const 的语义不同。如果您希望数组实际上是只读的(即读者无法修改),则需要使用自定义访问器包装它。在@interface 中(假设您的someArray 属性)

    @property (readonly) NSArray *readOnlyArray;
    

    @implementation

    @dynamic readOnlyArray;
    
    + (NSSet*)keyPathsForValuesAffectingReadOnlyArray {
      return [NSSet setWithObject:@"someArray"];
    }
    - (NSArray*)readOnlyArray {
      return [[[self someArray] copy] autorelease];
    }
    

    请注意,调用者仍然能够改变数组中对象的状态。如果你想防止那个,你需要让它们在插入时不可变,或者在readOnlyArray访问器中执行数组的depp-copy。

    【讨论】:

    • "注意,这与 C++ 的 const 的语义不同。"取决于“const”的放置位置
    • 你能解释一下为什么你用@dynamics verses 不写吗?
    • @docchang 只是为了明确。 @dynamic 不是必需的,但可以很好地提醒未来的读者,您打算提供实现而不是综合它。
    猜你喜欢
    • 2012-05-30
    • 2012-01-14
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多