Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.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
Objective c 有了ARC,为什么还要使用@properties?_Objective C_Ios_Xcode_Automatic Ref Counting - Fatal编程技术网

Objective c 有了ARC,为什么还要使用@properties?

Objective c 有了ARC,为什么还要使用@properties?,objective-c,ios,xcode,automatic-ref-counting,Objective C,Ios,Xcode,Automatic Ref Counting,在非ARC代码保留属性中,可以使用self.property=语法方便地为您管理内存,因此我们被教导在几乎所有情况下都使用它们 但是现在有了ARC,内存管理不再是一个问题,使用属性的原因也就消失了吗?还有什么好的理由(显然不是提供对实例变量的公共访问)再使用属性吗?我认为我从来没有仅仅因为内存管理而使用过属性,我认为你也不应该这样做。所以要回答你的问题,不,除了访问实例变量之外,没有理由使用属性,这基本上就是它们应该首先使用的 但是现在有了ARC,内存管理就不再是问题了 使用属性的原因是什么?还

在非ARC代码保留属性中,可以使用
self.property=
语法方便地为您管理内存,因此我们被教导在几乎所有情况下都使用它们


但是现在有了ARC,内存管理不再是一个问题,使用属性的原因也就消失了吗?还有什么好的理由(显然不是提供对实例变量的公共访问)再使用属性吗?

我认为我从来没有仅仅因为内存管理而使用过属性,我认为你也不应该这样做。所以要回答你的问题,不,除了访问实例变量之外,没有理由使用属性,这基本上就是它们应该首先使用的

但是现在有了ARC,内存管理就不再是问题了 使用属性的原因是什么?还有什么好的吗 原因(显然不是提供对实例的公共访问 变量)是否继续使用属性

是--通过使用@property和@synthesisted getter/setter,您可以保证:

  • 您的getter/setter可以是子类,子类可以覆盖存储和/或行为
  • 一切都很好地封装起来
  • 您可以使用观察挂钩--KVO等--监控内部和外部的变化
  • 您可以方便地在读取和/或写入属性时设置断点
  • 如果需要公开“仅限内部”的实例变量,则需要复制@property声明本身;更不用说重构了
  • 您可以利用所有各种修改器关键字的声明功能--复制、强、弱、原子等--编译器在这方面的优势越来越大

即使在类内部,我通常倾向于使用属性和点语法来维护对象内的状态。这并不是普遍正确的——如果我的设计是这样的,那么会有一些我直接操作的实例变量(完全直接操作;根本没有@property)。无论如何,暴露会意味着大规模重构。

你说的是两件不同的事情。ARC用于管理内存,因此您不必为大量dealloc和retain语句所累


属性给类提供了控制/限制其内部IVAR暴露的机会,为其他类提供了一个与之通信/交互的API。

除了保留之外,还有其他修饰符,有时可能会变得非常有用,例如将块分配给类成员变量时的“复制”,或“
readonly
”,确保属性无法写入。另外,在处理核心数据时,不要忘记“
动态”
”属性,以及在分配或检索属性时(定义自定义getter/setter而不是使用@synthesis)执行自定义代码的可能性

那么,使用属性的原因是否消失了

随着ARC将“所有权魔法”提供给IVAR,人们为什么会选择房产而不是IVAR的这一特定方面确实消失了。然而,还有许多其他问题仍然存在:

  • 原子/非原子区分适用于属性,而不适用于IVAR
  • 属性(只读/读+写区别)提供的灵活性不适用于IVAR
  • IVAR无法执行计算和参数检查

我继续使用属性作为保留状态的默认方式,这些状态可能会暴露给外部类或内部“同级”类,因为额外的灵活性超过了运行时的额外成本。

此外,属性还使添加复制语义和原子语义更容易、更安全。另外,使用@synthesis propname=ivarname创建一个具有一个名称的属性和一个具有另一个名称的实例变量;总是有用的。同意,谢谢你的回答。我还想补充一点,关于@property performance与ivar的比较,有很多讨论。我敢说你会发现非原子性质和ivar之间的性能差异。。。它可能是不可测量的可忽略不计的。您是否也同意,修饰符关键字weak、strong、atomic等对于您的api以及arc本身来说都是有用的标志,可以帮助您理解您的意图?如果您没有使用属性,那么您可能是做错了。“有时可能看起来很乏味或迂腐,但如果您始终使用访问器方法,内存管理出现问题的可能性会大大降低。如果您在整个代码中使用retain和release on实例变量,则几乎可以肯定您做了错误的事。”—内存管理编程指南, Apple@DaveBatton那句话不适用于任何人ARC@JesseGumpo同意,它不适用于ARC。我打算用它来回应凯文的评论,他从来没有“仅仅因为内存管理而使用过属性…”