【问题标题】:Objective-C Mutable property, copy retain, etc?Objective-C 可变属性,复制保留等?
【发布时间】:2023-04-09 08:10:01
【问题描述】:

当我为一个可变接口声明一个属性时,我应该总是让它(非原子,副本)吗?还有什么时候我会使用assign而不是retain?

【问题讨论】:

  • 当您为 iOS4 或更早版本进行开发并且无法使用自动引用计数时。这适用于你的情况吗?分配用于原始类型(BOOL、NSInteger)或您不拥有的对象指针。保留用于内存中带有指针的对象。复制会创建一个单独的副本,因此您可以保持原件不变。如果您不使用旧代码,则应该查看 ARC 和更现代的示例。如果你好奇,请看这里:stackoverflow.com/questions/2255861/…

标签: objective-c properties mutable


【解决方案1】:

当您更关心性能而不是线程安全时,请使用nonatomic。原子属性是线程安全的,但速度较慢。默认行为是atomic

当您希望在为属性设置新值时生成副本时,请使用copy。请注意,在许多情况下,copy 实际上不会复制对象,因此这通常不会影响性能,但如果有人给您一个可变副本(例如,您有一个 NSString 属性并且有人分配一个NSMutableString

永远不要使用retainstrong,因为它们仅在 ARC 关闭时才需要,并且您应该始终打开 ARC。 strongretain 相同,这是启用 ARC 的默认行为。只需打开 ARC 并忽略这些,向后兼容的代码除外。

有时,例如委托属性,使用retainstrong 会造成内存泄漏。在这些情况下,您需要使用weakassign。一般来说,您应该使用weak,因为assign 可能有罕见的边缘情况错误。

【讨论】:

  • 为什么不再使用retain了?
  • @Savagewood 抱歉,我按回车键并在写到一半时发布了我的答案。保留是现代项目中的默认行为,它只在旧项目中需要。有些人仍然出于习惯使用它,但这些天不使用它。只需打开 ARC。
  • 如果使用ARC,你会使用weak。如果没有 ARC(旧代码)分配。
  • 在这种情况下你可以使用weak或assign。大部分时间应该使用弱,因为它更安全。请参阅文档了解原因。
  • atomic 不保证线程安全。它只保证属性将在面对线程集/访问时返回一致的值。线程安全是一个比单个属性级别更大的问题。见:stackoverflow.com/questions/588866/…
【解决方案2】:

通常你@synthesize你的类实现中的一个属性,它创建一个集合函数。您可以编写自己的属性集函数,并在那里进行可变复制。问题解决了……

- (void)setPropertyName:(propertyType *)newProperty {

  if (propertyName) [propertyName release];
  propertyName = [newProperty mutableCopy];
}

【讨论】:

    猜你喜欢
    • 2023-04-05
    • 2013-04-12
    • 2011-01-16
    • 2020-06-19
    • 2012-05-18
    • 1970-01-01
    • 2023-03-30
    • 2011-08-16
    • 1970-01-01
    相关资源
    最近更新 更多