使用ARC时“复制”

时间:2013-08-27 00:03:12

标签: iphone ios automatic-ref-counting

我知道在使用ARC并且您拥有NSString属性时,就像MRC一样@property(nonatomic, copy)。但是我想知道,在我将项目转换为ARC后,我仍然在初始化方法中使用它:

_someString = [someStringParameter copy]

这是一个错误吗?或者甚至使用ARC,我还需要明确说“copy”吗?或者我应该这样做:

self.someString = someStringParameter

一切都会好的?有点困惑......

2 个答案:

答案 0 :(得分:2)

您永远不会在初始化程序中使用self.someString = anything。点符号是方法调用。您不应该在尚未完全实例化的类上调用方法。最明显的失败案例:子类覆盖setSomeString: - 当调用该方法时,它在init中的位置?

ARC将在实例变量上处理正确的保留和释放,但不能自动复制 - 例如有__strong__weak修饰符,但没有__copy。因此,在执行直接实例变量赋值时,仍需要显式复制。

答案 1 :(得分:1)

_someString = [someStringParameter copy];
  

这是一个错误吗?

没有

  

即使使用ARC,我还需要明确说“复制”吗?

绝对

您正在通过副本分配实例变量,它在ARC下完全合法。与此相反,只做:

_someString = someStringParamenter;

会导致ARC自动保留(不复制)它,导致类似

_someString = [someStringParameter retain];

这是因为除非另有说明,否则A​​RC变量下有一个隐式__strong标识符。


self.someString = someStringParameter

这是正确的,如果您在属性声明中提供了copy属性,那么在ARC和MRC下,您将获得要复制的对象。

也就是说,在初始化程序中使用访问器方法仍然是一个坏主意,因为如果您有自定义实现,它们可能会产生不必要的副作用。查看关于主题的答案:Should I refer to self.property in the init method with ARC?