【问题标题】:Do I have to specify memory management properties with ARC?我是否必须使用 ARC 指定内存管理属性?
【发布时间】:2021-08-29 02:01:48
【问题描述】:

既然 ARC 已经是多年的标准,我是否必须编写这样的代码:

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

或者只是简化为这个?

@property NSString *title;
@property NSString *subtitle;

【问题讨论】:

    标签: objective-c memory-management


    【解决方案1】:

    你问:

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

    【讨论】:

      【解决方案2】:

      ARC 具有默认属性参数。
      以下 2 个属性定义相同。
      @property NSArray *name;
      @property (strong, atomic, readwrite) NSArray *name;

      【讨论】:

        猜你喜欢
        • 2019-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-26
        • 2013-01-17
        • 1970-01-01
        • 2019-05-11
        相关资源
        最近更新 更多