提问人:Vulkan 提问时间:6/12/2021 更新时间:6/13/2021 访问量:43
是否必须使用 ARC 指定内存管理属性?
Do I have to specify memory management properties with ARC?
问:
由于 ARC 现在是多年的标准,我必须编写这样的代码:
@property (nonatomic, retain) NSString *title;
@property (copy) NSString *subtitle;
或者只是简化为这个?
@property NSString *title;
@property NSString *subtitle;
答:
0赞
Taron Qalashyan
6/12/2021
#1
ARC 具有默认属性参数。
以下 2 个属性定义是相同的。
@property NSArray *name;
@property(强、原子、读写) NSArray *name;
1赞
Rob
6/13/2021
#2
你问:
是否必须使用 ARC 指定内存管理属性?
简而言之,如果你想要默认行为以外的任何东西,是的,你可以这样做。默认行为是 和 。例如,如果需要复制行为,则必须指定 .如果需要非原子行为,则必须指定 .atomic
strong
copy
nonatomic
因此,让我们考虑以下两种演绎形式:title
@property (nonatomic, retain) NSString *title; // nonatomic
@property NSString *title; // defaults to atomic, strong
两者是不同的,因为前者是,后者是。此外,第一个显式使用 ,它在 ARC 中实现了与 相同的行为。话虽如此,我们更喜欢在 ARC 中使用(而不是 ),因为我们现在考虑的是引用类型,而不是引用计数。nonatomic
atomic
retain
strong
strong
retain
如果您确实想简化第一个示例,则可以删除并依赖对象属性默认为 ,默认情况下这一事实。retain
strong
@property (nonatomic) NSString *title; // strong (by default), nonatomic
只有当你真的想引入原子访问器方法的开销时,你才会删除。nonatomic
请考虑以下两个:
@property (copy) NSString *subtitle; // copy semantics
@property NSString *subtitle; // strong reference only
这两者是不同的,前者采用复制语义(提供关键保护,防止引用在其背后更改),而后者则没有。NSMutableString
评论