问题描述
既然 ARC 已经成为标准多年了,我是否必须像这样编写代码:
@property (nonatomic,retain) Nsstring *title;
@property (copy) Nsstring *subtitle;
或者只是简化成这样?
@property Nsstring *title;
@property Nsstring *subtitle;
解决方法
你问:
我是否必须使用 ARC 指定内存管理属性?
简而言之,如果您想要默认行为以外的任何东西,是的,您可以。默认行为是 atomic
和 strong
。例如,如果您想要复制行为,则必须指定 copy
。如果您想要非原子行为,则必须指定 nonatomic
。
那么,让我们考虑两个 title
的再现:
@property (nonatomic,retain) NSString *title; // nonatomic
@property NSString *title; // defaults to atomic,strong
两者不同,前者是nonatomic
,后者是atomic
。此外,第一个显式使用 retain
,它在 ARC 中实现与 strong
相同的行为。话虽如此,我们更喜欢在 ARC 中使用 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
引用在其背后更改)而后者没有。
ARC 具有默认属性参数。
以下 2 个属性定义相同。
@property NSArray *name;
@property (strong,atomic,readwrite) NSArray *name;