微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我是否必须使用 ARC 指定内存管理属性?

如何解决我是否必须使用 ARC 指定内存管理属性?

既然 ARC 已经成为标准多年了,我是否必须像这样编写代码

@property (nonatomic,retain) Nsstring *title;
@property (copy) Nsstring *subtitle;

或者只是简化成这样?

@property Nsstring *title;
@property Nsstring *subtitle;

解决方法

你问:

我是否必须使用 ARC 指定内存管理属性?

简而言之,如果您想要默认行为以外的任何东西,是的,您可以。默认行为是 atomicstrong。例如,如果您想要复制行为,则必须指定 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;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。