0

可能重复:
我应该在 ARC 的 init 方法中引用 self.property 吗?

我是 Objective-C 的新手,并且仍然试图了解所有不同的东西(来自 C# 和 C)。我在我的项目中使用 ARC。

假设我有一个这样的构造函数:

-(id)initWithPriority:(NSNumber *)x1 Value:(id)y1

我有两个(强)(综合)属性(x2,y2)。如果我做:

_x2=x1;
_y2=y1;

(跳过通过属性,只访问合成的 ivars),而不是

x2=x1;
y2=y1;

ARC 是否仍然起作用(就像它仍然保持保留计数一样)?

4

3 回答 3

4

您将直接设置实例变量,而不使用访问器。ARC 将执行引用计数。

注意:您还需要在初始化程序的实现中保留属性的语义。例如,如果它声明copy了 ,那么您将在初始化程序中将参数的副本分配给 ivar。


补充阅读:

我应该在 ARC 的 init 方法中引用 self.property 吗?

初始化属性,点表示法

于 2012-11-09T23:34:27.600 回答
3

ARC按任务操作;否则将是毫无目的的。(如果它只能通过属性进行操作,它不会向 ARC 之前存在的内容添加任何内容。)所以是的,如果您直接分配给 ivar,分配的值会自动保留。

如果它是您的 ivar ,您应该直接分配给ivar ,因为在 期间,您的对象还没有完全准备好状态。因此,在 中,直接对 ivars执行对您的ivars 的任何分配;不要使用访问器/属性。例子:init...init...

- (id) initWithName: (NSString*) s { 
    self = [super init]; 
    if (self) {
        self->_name = [s copy]; //
    }
    return self; }

但是,您可以分配给您的超类的属性。因此,如果这是一个 UIViewController 子类,分配到self.title就可以了。

有关 ARC 工作原理的完整说明,请参阅我的书:

http://www.aeth.com/iOSBook/ch12.html

于 2012-11-09T23:34:57.207 回答
3

是的,您可以直接分配实例变量。

如果没有 ARC,您将需要保留该对象:

[_x1 release];
_x1 = [x1 retain];

使用 ARC,您只需分配实例变量:

_x1 = x1;
于 2012-11-09T23:35:15.973 回答