我仍在学习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环境自动创建哪种类型的吸气剂/设置剂。

那么浮点数,整数等标量类型呢?

最佳答案

一些想法:

  • 基本数据类型(intbool等)的访问器方法(getter和setter)与对象的标准访问器方法非常相似,唯一的区别是没有内存管理语义,因为它们没有除了在对象上下文内没有任何意义。因此,您将看不到这些基本数据类型的strongweak。因此,retain的概念也不适用。
  • 在后台,系统为ARC中声明为strong属性的对象生成的设置器与非ARC代码中对象的retain属性的设置器并无不同。这样会增加保留计数(也称为“保持强引用”)。现在,很明显,如果您是为自己的strong属性编写ARC setter(您实际上不应该这样做),则不会编写写着retain的代码行,但是编译器实际上是在场景。
  • 我不太确定使用您的getter方法,因为它不太有意义。通常,吸气剂不会为您做任何allocinit
  • 您的设置者离我们更近一些(我假设这是针对声明为@propertyretain的)。显然,自动合成的设置器将自动选择内存寿命限定符(例如retainassigncopy与...),并为您生成合适的代码,因此最好让它自己做。
  • 顺便说一下,实际的系统生成的setter也将包含KVO(key-value-notification)调用。您不必担心什么是KVO,但关键是您不想用自己的手写setter方法乱写代码,因为当您开始使用KVO时,您会后悔这样做。这只是让编译器综合自己的访问器方法的另一个原因。
  • 关于iphone - ARC环境中的设置者和获取者,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16427537/

    10-14 20:34