提问人:rolling_codes 提问时间:6/20/2014 更新时间:3/11/2020 访问量:1027
Objective-C 可变属性、复制保留等?
Objective-C Mutable property, copy retain, etc?
答:
1赞
Abhi Beckert
6/20/2014
#1
当您更关心性能而不是线程安全时使用。原子属性是线程安全的,但速度较慢。默认行为为 。nonatomic
atomic
当您希望在为属性设置新值时进行复制时使用。请注意,在许多情况下,不会实际创建对象的副本,因此这通常不会影响性能,但如果有人给你一个可变副本(例如,你有一个属性,有人分配了一个 .copy
copy
NSString
NSMutableString
永远不要使用 OR 因为只有在 ARC 关闭时才需要这些,并且您应该始终打开 ARC。 并且是相同的,这是启用 ARC 时的默认行为。只需打开 ARC 并忽略这些代码,向后兼容的代码除外。retain
strong
strong
retain
有时,例如委托属性,使用 或 会造成内存泄漏。在这些场景中,您需要使用或 .通常,您应该使用 ,因为可能会有罕见的边缘情况错误。retain
strong
weak
assign
weak
assign
评论
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];
}
评论