【问题标题】:What's the typical use-case of the copy properties attribute复制属性属性的典型用例是什么
【发布时间】:2016-02-24 16:10:26
【问题描述】:

copy 属性的典型用例是什么?

我什么时候应该复制一些值而不是仅仅增加引用计数,因为它可以通过strong 属性来实现?

【问题讨论】:

  • 把两个NSMutableString属性放到一个对象上,一个copy,一个strong。执行NSMutableString *string = [[NSMutableString alloc] initWithString:@"Hello "]; 并将其设置为对象的两个属性。记录这两个属性。然后执行[string appendString:@"World"];,再次记录这两个属性。你会看到的。执行相同操作并查看对象地址。
  • 一个好的经验法则是:如果属性是指向采用NSCopying 协议的类的指针,则该属性应该具有copy 属性,除非您有充分的理由不应该。

标签: ios objective-c properties


【解决方案1】:

其他人之前已经回答过这个问题,所以我只为您指出其中的几个。

首先,Apple 文档:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html,搜索“复制属性维护自己的副本”

这里对各种属性属性进行了很好的解释:Objective-C declared @property attributes (nonatomic, copy, strong, weak)

这个答案很好地解释了一个非常典型的用例以及为什么要使用副本:NSMutableString as retain/copy

然而,两者都没有提到块属性,并且您从不想要使用除 copy 之外的任何东西其他块(当然,假设您正在使用ARC,而且 ARC 甚至会自动为您处理):

注意:您应该指定 copy 作为属性属性,因为 需要复制块以跟踪其在外部捕获的状态 的原始范围。这不是您需要担心的事情 当使用自动引用计数时,它会发生 自动,但最好将 property 属性设置为 显示结果行为。有关详细信息,请参阅块 编程主题。

从这里:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/WorkingwithBlocks/WorkingwithBlocks.html

【讨论】:

  • 其实ARC下不需要显式复制块。甚至在文档中提供的引用中也提到了这一点:“使用自动引用计数时,您无需担心,因为它会自动发生”
  • 公平点。我个人喜欢明确说明某些事情(包括),但这绝不是必需的。我想我的评论应该已经读到“除了copy,你永远不想使用任何other作为块,但你不需要明确指定它”。感谢您的澄清,我已相应地编辑了我的评论。
猜你喜欢
  • 2011-11-02
  • 2014-08-10
  • 1970-01-01
  • 2020-09-09
  • 1970-01-01
  • 2021-08-14
  • 1970-01-01
  • 1970-01-01
  • 2018-04-28
相关资源
最近更新 更多