ARC环境下的Setters和Getters

时间:2013-05-07 20:01:51

标签: iphone ios ipad automatic-ref-counting

我还在学习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环境中发布并保留不能使用。在这种情况下,ARC环境会自动创建什么样的getter / setter。

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

2 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:3)

有几点想法:

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

  2. 在幕后,系统为ARC中声明为strong属性的对象生成的setter与非ARC代码中对象的retain属性的setter没有什么不同。它增加了保留计数(a.k.a。"保持强大的参考")。现在,很明显,如果您自己为strong属性编写ARC setter(您真的不应该这样做),那么您就不会编写代表retain的代码行。 ,但编译器实际上是在幕后为您做这件事。

  3. 我不太确定你的getter方法,因为它没有意义。通常,getter不会为您执行任何allocinit

  4. 你的二传手更接近(我认为这是一个@property声明为retain)。显然,自动合成的setter会自动获取内存生命周期限定符(例如retain vs. assign vs. copy vs. ...)并为您生成相应的代码,因此让它做自己的事情会更好。

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