我知道在使用ARC并且您拥有NSString
属性时,就像MRC一样@property(nonatomic, copy)
。但是我想知道,在我将项目转换为ARC后,我仍然在初始化方法中使用它:
_someString = [someStringParameter copy]
这是一个错误吗?或者甚至使用ARC,我还需要明确说“copy
”吗?或者我应该这样做:
self.someString = someStringParameter
一切都会好的?有点困惑......
答案 0 :(得分:2)
您永远不会在初始化程序中使用self.someString = anything
。点符号是方法调用。您不应该在尚未完全实例化的类上调用方法。最明显的失败案例:子类覆盖setSomeString:
- 当调用该方法时,它在init
中的位置?
ARC将在实例变量上处理正确的保留和释放,但不能自动复制 - 例如有__strong
和__weak
修饰符,但没有__copy
。因此,在执行直接实例变量赋值时,仍需要显式复制。
答案 1 :(得分:1)
_someString = [someStringParameter copy];
这是一个错误吗?
没有
即使使用ARC,我还需要明确说“复制”吗?
绝对
您正在通过副本分配实例变量,它在ARC下完全合法。与此相反,只做:
_someString = someStringParamenter;
会导致ARC自动保留(不复制)它,导致类似
_someString = [someStringParameter retain];
这是因为除非另有说明,否则ARC变量下有一个隐式__strong
标识符。
self.someString = someStringParameter
这是正确的,如果您在属性声明中提供了copy
属性,那么在ARC和MRC下,您将获得要复制的对象。
也就是说,在初始化程序中使用访问器方法仍然是一个坏主意,因为如果您有自定义实现,它们可能会产生不必要的副作用。查看关于主题的答案:Should I refer to self.property in the init method with ARC?