Objective-C 可变属性、复制保留等?

Objective-C Mutable property, copy retain, etc?

提问人:rolling_codes 提问时间:6/20/2014 更新时间:3/11/2020 访问量:1027

问:

当我为可变接口声明属性时,我是否应该始终将其设为(非原子、复制)?另外,我什么时候会使用分配而不是保留?

目标-C 性能 可变

评论

1赞 mc01 6/20/2014
当您针对 iOS4 或更早版本进行开发并且无法使用自动引用计数时。这适用于您的情况吗?Assign 适用于基元类型(BOOL、NSInteger)或你不拥有的对象指针。Retain 用于内存中带有指针的对象。“复制”会创建一个单独的副本,以便您可以保持原件不变。如果你没有使用旧代码,你应该看看 ARC 和更现代的例子。如果您好奇,请参阅此处:stackoverflow.com/questions/2255861/...

答:

1赞 Abhi Beckert 6/20/2014 #1

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

当您希望在为属性设置新值时进行复制时使用。请注意,在许多情况下,不会实际创建对象的副本,因此这通常不会影响性能,但如果有人给你一个可变副本(例如,你有一个属性,有人分配了一个 .copycopyNSStringNSMutableString

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

有时,例如委托属性,使用 或 会造成内存泄漏。在这些场景中,您需要使用或 .通常,您应该使用 ,因为可能会有罕见的边缘情况错误。retainstrongweakassignweakassign

评论

0赞 rolling_codes 6/20/2014
为什么不再使用 Retain?
1赞 Abhi Beckert 6/20/2014
@Savagewood抱歉,我按了回车键,并在写到一半时发布了我的答案。Retain 是现代项目中的默认行为,只有在旧项目中才需要它。有些人仍然出于习惯使用它,但现在不使用它了。只需打开 ARC。
1赞 mc01 6/20/2014
如果使用 ARC,则使用 weak。如果没有 ARC(旧代码)分配。
1赞 Abhi Beckert 6/20/2014
在这种情况下,可以使用 weak 或 assign。大多数时候都应该使用 weak,因为它更安全。请参阅文档了解原因。
4赞 bbum 6/20/2014
atomic不保证螺纹安全。它只保证属性在面对线程集/访问时返回一致性值。螺纹安全是一个比单个财产层面更大的问题。请参见:stackoverflow.com/questions/588866/...
0赞 8AxleEd 3/8/2020 #2

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

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

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