【问题标题】:Objective-C ARC Should constructor set Instance Variable or Property? [duplicate]Objective-C ARC 构造函数应该设置实例变量还是属性? [复制]
【发布时间】:2012-10-30 07:55:55
【问题描述】:

可能重复:
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 是否仍然有效(就像它仍然保持保留计数一样)?

【问题讨论】:

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


【解决方案1】:

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

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


补充阅读:

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

Initializing a property, dot notation

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • @justin 它很好,事实证明苹果一直在这样做,例如这里(只是我偶然发现的第一个):developer.apple.com/library/ios/#samplecode/… 原因是我们已经调用了 super,所以来自超类的我们自己的方面已经准备好。此外,在许多情况下,没有比初始化程序更好的地方来设置某些超类属性,而属性/访问器是您唯一的途径。
    • 不...这不好 :) 将超类可能调用的所有内容视为 setter 实现的副作用。参考您链接的示例/示例:说设置自己的背景视图将视图添加到自己的视图图中——好吧,你和你的非构造子类实现将收到调整大小和布局命令——所有这些都是在他们有机会初始化之前.同样的问题和副作用在这里看到:stackoverflow.com/questions/5932677/…(续)
    • (cont) 只有在某些情况下,您才能证明调用动态方法的确切副作用,但这是一个相当沉重的手动维护负担,所以这只是 IMO 的一个坏主意。一般安全吗?不。我不在乎它是否来自苹果。他们的样本和他们提供的程序还有很大的改进空间(幸运的是,这些年来,IMO 的质量普遍提高了)。如果你花钱请一位优秀的开发人员来审查他们的示例代码,他们会告诉你的。也有关于它的博客。 (续)
    • (cont) 他们最优秀和最聪明的人并不总是编写示例代码,或者作者可能会制作“捷径”来专注于示例旨在说明的点(通常在 cmets 中制作)。
    【解决方案3】:

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

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

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

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

    _x1 = x1;
    

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 2012-12-23
      • 2017-12-22
      • 2012-06-30
      • 1970-01-01
      • 2012-10-01
      • 2019-03-10
      • 1970-01-01
      • 2010-12-05
      相关资源
      最近更新 更多