可能重复:
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仍然可以正常运行(就像它仍保留一个保留计数一样)?
答案 0 :(得分:4)
您可以直接设置实例变量,不使用访问者。 ARC将执行引用计数。
注意:您还需要在初始化程序的实现中保留属性的语义。例如,如果它声明copy
,则您将在初始化程序中将参数的副本分配给ivar。
补充阅读:
Should I refer to self.property in the init method with ARC?
答案 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如何工作的完整说明,请参阅我的书:
答案 2 :(得分:3)
是的,您可以直接分配实例变量。
如果没有ARC,则需要保留对象:
[_x1 release];
_x1 = [x1 retain];
使用ARC,您只需分配实例变量:
_x1 = x1;