0

我知道当你使用 ARC 并且你有一个NSString属性时,你@property(nonatomic, copy)会像使用 MRC 一样做。但我想知道,在我将项目转换为 ARC 之后,我的初始化方法中仍然有这个:

_someString = [someStringParameter copy]

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

self.someString = someStringParameter

一切都会好起来的?这里有点糊涂...

4

2 回答 2

2

您永远不会self.someString = anything在初始化程序中使用。点表示法是一种方法调用。您不应该在尚未完全实例化的类上调用方法。最明显的失败案例:一个子类覆盖——当该方法被调用时setSomeString:它在哪里?init

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

于 2013-08-27T00:07:53.273 回答
1
_someString = [someStringParameter copy];

这是一个错误吗?

不。

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

绝对地。

您通过复制分配实例变量,它在 ARC 下是完全合法的。与此相反,只做:

_someString = someStringParamenter;

将导致 ARC 自动保留(而不是复制)它,从而导致类似

_someString = [someStringParameter retain];

发生这种情况是因为在 ARC 下变量具有隐式__strong标识符,除非另有说明。


self.someString = someStringParameter

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

也就是说,在初始化程序中使用访问器方法仍然是一个坏主意,因为如果您有自定义实现,它们可能会产生不希望的副作用。查看有关该主题的答案:我应该在使用 ARC 的 init 方法中引用 self.property 吗?

于 2013-08-27T00:04:57.660 回答