Objective-C ARC构造函数应该设置实例变量或属性吗?
可能重复:Objective-C ARC构造函数应该设置实例变量或属性吗?,objective-c,ios,initialization,automatic-ref-counting,reference-counting,Objective C,Ios,Initialization,Automatic Ref Counting,Reference Counting,可能重复: 我对Objective-C还不熟悉,但我仍在努力了解所有与C和C不同的东西。我正在我的项目中使用ARC 假设我有一个这样的构造函数: -(id)initWithPriority:(NSNumber *)x1 Value:(id)y1 我得到了两个(强)(合成)性质(x2,y2)。如果我这样做: _x2=x1; _y2=y1; (跳过属性,只访问合成的IVAR)而不是 x2=x1; y2=y1; ARC是否仍然起作用(比如它是否仍然保留保留计数)?您可以直接设置实例变量,而不使
我对Objective-C还不熟悉,但我仍在努力了解所有与C和C不同的东西。我正在我的项目中使用ARC 假设我有一个这样的构造函数:
-(id)initWithPriority:(NSNumber *)x1 Value:(id)y1
我得到了两个(强)(合成)性质(x2,y2)。如果我这样做:
_x2=x1;
_y2=y1;
(跳过属性,只访问合成的IVAR)而不是
x2=x1;
y2=y1;
ARC是否仍然起作用(比如它是否仍然保留保留计数)?您可以直接设置实例变量,而不使用访问器。ARC将执行参考计数 注意:您还希望在初始值设定项的实现中保留属性的语义。例如,如果它声明了
copy
,那么您将在初始值设定项中将参数的副本分配给ivar
补充阅读:
ARC根据任务进行操作;否则就没有目的了。(如果它只能通过属性进行操作,它不会向ARC之前存在的内容添加任何内容。)因此,是的,如果直接指定给ivar,则指定的值将自动保留 如果ivar是您的ivar,您应该直接分配给它,因为在
init…
期间,您的对象尚未完全就绪。因此,在init…
中,直接向IVAR执行对IVAR的任何分配;不要使用访问器/属性。例如:
- (id) initWithName: (NSString*) s {
self = [super init];
if (self) {
self->_name = [s copy]; //
}
return self; }
但是,您可以指定给超类的属性。因此,如果这是一个UIViewController子类,那么分配给self.title
就可以了
有关ARC工作原理的完整说明,请参阅我的书:
是的,您可以直接分配实例变量 如果没有圆弧,则需要保留对象:
[_x1 release];
_x1 = [x1 retain];
使用ARC,您可以只分配实例变量:
_x1 = x1;
顺便说一句另外,我假设在那个例子中,
x2=x1
,您的意思是说self.x2=x1代码>或[自我设置x2:x1]
@justin这很好,苹果一直都在做这件事,这就证明了这一点,例如,在这里(这是我偶然发现的第一件):原因是我们已经调用了super,所以来自超类的我们的方面已经准备好了。此外,在许多情况下,没有比初始值设定项更好的地方来设置某些超类属性,而属性/访问器是您进入的唯一途径。不。。。这不太好:考虑超类可能称为设置器的实现带来的副作用。参考您链接的示例:假设设置self的背景视图将视图添加到self的视图图中——好吧,您和您未构造的子类实现将收到调整大小和布局命令——所有这些都是在它们有机会初始化之前发出的。同样的问题和副作用也出现在这里:(cont)(cont)只有在某些情况下,您才能证明调用动态方法的确切副作用,但这是一个相当沉重的手动维护负担,所以在我看来这只是一个坏主意。通常安全吗?不,我不在乎它是否来自苹果。他们提供的样品和程序还有很大的改进空间(幸运的是,这些年来质量总体上有所提高)。如果你付钱给一个非常优秀的开发人员来审查他们的示例代码,他们会告诉你。也有关于它的博客。(续)(续)他们最好和最聪明的人并不总是写示例代码,或者作者可能会做出“捷径”来关注示例设计要说明的点(通常在注释中)。