【问题标题】:NSString property copy or readonly?NSString 属性复制还是只读?
【发布时间】:2011-11-03 03:39:57
【问题描述】:

我看到很多讨论说我应该使用 copy 作为 NSString 属性,因为它会阻止其他人在我背后更改它。但是为什么我们不为它设置 readonly 属性呢?

更新

感谢您回答我的问题。但问题是对于 NSString 属性,你总是不希望别人修改它,对吧?您可以自己修改它,但绝对不能由其他人修改。我想大多数时候 NSString 都会设置它的初始值(由你或其他人),之后只有你会修改它。那为什么不直接使用只读属性

实际上我大部分时间都在使用副本。但后来我意识到大多数时候我只在我的 init 方法中使用这些设置器。所以我认为我应该在这种情况下使用 readonly 而不是 copy。

所以让我这样问:如果您只在 init 方法中为您的 NSStrings 使用这些设置器,那么您应该使用 readonly 代替。这是一个合理的结论吗?

【问题讨论】:

    标签: objective-c memory-management properties nsstring


    【解决方案1】:

    如果你只在你的 init 方法中为你的 NSStrings 使用这些设置器,那么你应该使用 readonly 来代替。这是一个合理的结论吗?

    既然你不应该在部分构造的状态下使用访问器(init/dealloc),那么你应该将它声明为copyreadonly,然后在初始化器中执行复制:

    - (id)initWithName:(NSString *)inName
    {
      self = [super init];
      if (0 != self) {
        name = [inName copy];
      }
      return self;
    }
    

    更详细地说,copyreadonly 在语义上是不同的概念。

    • 您使用copy 是因为您对大多数情况下的值感兴趣。使用不可变字符串也是一种保障和优化。

    • 您使用readonly 来禁止客户端更改/设置您的数据。

    它们共同提供了良好的安全性,但单独使用:

    • copy 仍然允许客户端通过 setter 在程序执行的任何时候设置值。

    • readonly 并不暗示copy,保留的属性可以在你背后更改;考虑一下当您传递一个可变变体并且客户端在调用 setter 后对其进行变异时会发生什么。

    最安全的方法是使用copyreadonly

    • 显然,当您需要为客户提供 setter 时,您将使用 readwrite,并且您支持该更改。

    • 保留字符串(或数组,或...)而不是复制通常是个坏主意。不复制这些类型几乎没有什么用处,而且会导致细微的错误。即使您正在处理可变类型,您通常也需要一个可变副本(编译器不会为您合成)。保留或分配这些类型几乎不是您想要的。我做的一个例外是在处理大量分配时,其中数据封装得很好(例如,我将所有权从一个地方传递到另一个地方以避免复制的一个沉重的 NSMutableData 实例)。

    【讨论】:

    • 感谢您更新我的问题。
    • “最安全的方法是使用复制和只读”。但这不会让您的客户感到困惑吗? readonly 表示没有 setter,而 copy 表示有 setter?当然,您的客户会进一步推断您在 .m 文件中添加了 readwrite,但声明 copy 和 readonly 仍然让我一见钟情。
    • 好的,我明白了。声明为副本的属性,保留与该类的用户无关。这是为了实现目的。我会接受你的回答。再次感谢!
    • @Qiulang 我仍然声明它为copy,因为它记录了该值是一个不可变的值,并且因为我习惯于将 NSString 属性视为copy。不客气。
    【解决方案2】:

    如果您不想让其他人修改您的属性,那么您绝对应该将其标记为readonly。人们说使用copy 意味着字符串不能在你背后更改时的意思是,如果有人将字符串分配给你的属性,并且字符串是可变的,然后当你以后访问你的时,他们会改变字符串属性,您将取回 changed 字符串。但是,如果您使用copy,那么您将获得字符串在分配给属性时的样子(这是人们期望发生的情况)的快照。

    【讨论】:

    • 感谢您回答我的问题。但问题是对于 NSString 属性,你总是不希望别人修改它,对吧?其他人可以设置那些 NSStrings 的首字母值,但你不希望他们修改它,对吧?
    • @Qiulang:很多时候,您确实希望其他人能够分配给您的属性。这实际上取决于您的类在做什么以及属性代表什么。
    猜你喜欢
    • 2014-01-09
    • 2022-07-12
    • 2012-06-30
    • 1970-01-01
    • 2012-06-21
    • 2014-04-11
    • 1970-01-01
    • 2015-08-14
    相关资源
    最近更新 更多