Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone ARC环境中的setter和getter_Iphone_Ios_Ipad_Automatic Ref Counting - Fatal编程技术网

Iphone ARC环境中的setter和getter

Iphone ARC环境中的setter和getter,iphone,ios,ipad,automatic-ref-counting,Iphone,Ios,Ipad,Automatic Ref Counting,我仍在学习CocoaTouch的一些细微差别。在ARC环境中,内部为float、int等类型生成什么类型的getter/setter 我知道,如果该属性是非圆弧上的对象,我可能会有如下内容: - (NSURL *)url { if (_url == nil) _url = [[MyURL alloc] initWithURL:url]; return _url } - (void)setUrl:(NSURL *)theUrl { if (theUrl != _url)

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

我知道,如果该属性是非圆弧上的对象,我可能会有如下内容:

- (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等标量类型呢?

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

一些想法:

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

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

  • 我不太确定你的getter方法,因为它没有什么意义。一般来说,getter不会为您执行任何
    alloc
    init

  • 您的setter比较接近(我假设这是针对声明为
    retain
    @属性的)。显然,自动合成的setter将自动拾取内存生存期限定符(例如,
    retain
    vs.
    assign
    vs.
    copy
    vs.…),并为您生成适当的代码,因此最好让它自己做

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


  • 3.对我来说是有道理的,这只是一个懒散的开始getter@Catfish_Man也许“没有意义”太强烈了。但是有一个名为
    url
    的getter,它用一个名为
    url
    的变量(ivar?global?)设置ivar
    \u url
    ,这对DD来说似乎不是一个很好的实现(实际上,出于很多原因,不仅仅是因为命名问题)。如果惰性初始化是一种计算开销大或内存密集型资源,但在这里似乎不谨慎,我将使用惰性初始化。如果我这样做了,我将倾向于使用稍微不同的实现。