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

Do I have to specify memory management properties with ARC?

提问人:Vulkan 提问时间:6/12/2021 更新时间:6/13/2021 访问量:43

问:

由于 ARC 现在是多年的标准,我必须编写这样的代码:

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

或者只是简化为这个?

@property NSString *title;
@property NSString *subtitle;
Objective-C 内存管理

评论


答:

0赞 Taron Qalashyan 6/12/2021 #1

ARC 具有默认属性参数。
以下 2 个属性定义是相同的。
@property NSArray *name;
@property(强、原子、读写) NSArray *name;

1赞 Rob 6/13/2021 #2

你问:

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

简而言之,如果你想要默认行为以外的任何东西,是的,你可以这样做。默认行为是 和 。例如,如果需要复制行为,则必须指定 .如果需要非原子行为,则必须指定 .atomicstrongcopynonatomic


因此,让我们考虑以下两种演绎形式:title

@property (nonatomic, retain) NSString *title; // nonatomic
@property NSString *title;                     // defaults to atomic, strong

两者是不同的,因为前者是,后者是。此外,第一个显式使用 ,它在 ARC 中实现了与 相同的行为。话虽如此,我们更喜欢在 ARC 中使用(而不是 ),因为我们现在考虑的是引用类型,而不是引用计数。nonatomicatomicretainstrongstrongretain

如果您确实想简化第一个示例,则可以删除并依赖对象属性默认为 ,默认情况下这一事实。retainstrong

@property (nonatomic) NSString *title;         // strong (by default), nonatomic

只有当你真的想引入原子访问器方法的开销时,你才会删除。nonatomic


请考虑以下两个:

@property (copy) NSString *subtitle;           // copy semantics
@property NSString *subtitle;                  // strong reference only

这两者是不同的,前者采用复制语义(提供关键保护,防止引用在其背后更改),而后者则没有。NSMutableString