2

我仍在学习 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 等标量类型呢?

4

2 回答 2

4

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

于 2013-05-07T20:09:56.953 回答
3

几个想法:

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

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

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

  4. 你的二传手更接近(我认为这是@property声明为retain)。显然,自动合成的设置器会自动获取内存生命周期限定符(例如retainvs. assignvs. copyvs. ...)并为您生成适当的代码,所以最好让它自己做。

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

于 2013-05-08T02:43:46.600 回答