你问:
我必须用 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 引用在其背后发生变化),而后者则没有。