Objective-C ARC应该构造函数设置实例变量还是属性?

时间:2012-11-09 23:28:23

标签: objective-c ios initialization automatic-ref-counting reference-counting

  

可能重复:
  Should I refer to self.property in the init method with ARC?

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

说我有一个像这样的构造函数:

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

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

_x2=x1;
_y2=y1;

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

x2=x1;
y2=y1;

ARC仍然可以正常运行(就像它仍保留一个保留计数一样)?

3 个答案:

答案 0 :(得分:4)

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

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


补充阅读:

Should I refer to self.property in the init method with ARC?

Initializing a property, dot notation

答案 1 :(得分:3)

ARC负责任务;否则就没用了。 (如果它必须只通过属性操作,它就不会在ARC之前添加任何东西。)所以是的,如果直接分配给ivar,则会自动保留指定的值。

应该直接分配到ivar ,如果它是你的ivar ,因为在init...期间,你的对象还没有完全状态就绪。因此,在init...中,直接对ivars执行您的 ivars的任何分配; 使用访问者/属性。例如:

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

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

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

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

答案 2 :(得分:3)

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

如果没有ARC,则需要保留对象:

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

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

_x1 = x1;