【问题标题】:Setters and Getters on ARC environmentARC 环境中的 Setter 和 Getter
【发布时间】:2013-05-07 20:01:51
【问题描述】:

我仍在学习 CocoaTouch 的一些细微差别。在 ARC 环境中,内部为 float、int 等类型生成了哪些类型的 getter/setter?

我知道,如果属性是非 ARC 上的对象,我可能会有这样的情况:

- (NSURL *)url {
  if (_url == nil) 
    _url = [[MyURL alloc] initWithURL:url];
  return _url
}

- (void)setUrl:(NSURL *)theUrl {
    if (theUrl != _url) {
      [_url release];
      _url = [theUrl retain];
    }
}

但在 ARC 环境中不能使用 release 和 retain。在这种情况下,会为 ARC 环境自动创建什么样的 getter/setter。

那么像 float、int 等标量类型呢?

【问题讨论】:

    标签: iphone ios ipad automatic-ref-counting


    【解决方案1】:

    ARC 为您处理所有释放和保留。您可能应该只使用合成的 getter 和 setter,但如果您不这样做,只需设置 ivar 并删除所有其他代码。

    【讨论】:

      【解决方案2】:

      一些想法:

      1. 基本数据类型(intbool 等)的访问器方法(getter 和 setter)与对象的标准访问器方法非常相似,唯一的区别是有没有内存管理语义,因为除了在对象的上下文中它们没有任何意义。因此,您将看不到具有这些基本数据类型的 strongweak。因此retain的概念也不适用。

      2. 在幕后,系统为在 ARC 中声明为 strong 属性的对象生成的设置器与非 ARC 代码中对象的 retain 属性的设置器没有什么不同。它增加了保留计数(又名“保持强引用”)。现在,很明显,如果你自己为 strong 属性编写 ARC 设置器(你真的不应该这样做),你就不会编写写着 retain 的那行代码,但编译器实际上正在这样做在幕后为您服务。

      3. 我不太确定你的 getter 方法,因为它不太有意义。通常吸气剂不会为您做任何allocinit

      4. 你的 setter 更接近一点(我假设这是针对声明为 retain@property)。显然,自动合成的设置器会自动获取内存生命周期限定符(例如retain vs. assign vs. copy vs. ...)并为您生成适当的代码,所以最好让它做自己的事。

      5. 顺便说一下,实际系统生成的 setter 也将包括 KVO (key-value-notification) 调用。你不必担心 KVO 是什么,但关键是你不希望你的代码被你自己手写的 setter 方法弄得乱七八糟,因为当你开始使用 KVO 时,你会后悔这样做的。这只是让编译器合成它自己的访问器方法的另一个原因。

      【讨论】:

      • 3.对我来说很有意义,它只是一个延迟初始化的 getter
      • @Catfish_Man 也许“没有意义”太强了。但是有一个名为url 的getter 将ivar _url 设置为一个名为url 的变量(ivar?global?)似乎并不冒犯DD,这对我来说是一个非常好的实现(实际上,对于很多原因,不仅仅是因为命名问题)。如果它是计算成本高或内存密集型资源,我将使用延迟初始化,但在这里似乎并不谨慎,如果我这样做了,我会倾向于稍微不同的实现。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2011-10-05
      • 2015-08-05
      • 2016-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多