Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective-C ARC构造函数应该设置实例变量或属性吗?_Objective C_Ios_Initialization_Automatic Ref Counting_Reference Counting - Fatal编程技术网

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)只有在某些情况下,您才能证明调用动态方法的确切副作用,但这是一个相当沉重的手动维护负担,所以在我看来这只是一个坏主意。通常安全吗?不,我不在乎它是否来自苹果。他们提供的样品和程序还有很大的改进空间(幸运的是,这些年来质量总体上有所提高)。如果你付钱给一个非常优秀的开发人员来审查他们的示例代码,他们会告诉你。也有关于它的博客。(续)(续)他们最好和最聪明的人并不总是写示例代码,或者作者可能会做出“捷径”来关注示例设计要说明的点(通常在注释中)。