Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.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 在目标C中何时避免使用访问器方法_Objective C - Fatal编程技术网

Objective c 在目标C中何时避免使用访问器方法

Objective c 在目标C中何时避免使用访问器方法,objective-c,Objective C,我一直在C代码示例中看到类似的情况: _myProp = newValue; 据我所知,创建属性myProp将创建实际变量\u myProp,以及两种访问器方法(默认情况下)myProp(getter)和setMyProp(setter) 我的问题是,为什么我总是看到通过访问器方法直接获取变量的示例代码?这样做有什么好处吗?有时您不想声明属性,而只想使用私有ivar 另一方面,如果存在属性声明,则除了在访问器的实现中,没有理由直接访问ivar 有时人们想绕过存取器的副作用,直接使用ivar。不

我一直在C代码示例中看到类似的情况:

_myProp = newValue;
据我所知,创建属性
myProp
将创建实际变量
\u myProp
,以及两种访问器方法(默认情况下)
myProp
(getter)和
setMyProp
(setter)


我的问题是,为什么我总是看到通过访问器方法直接获取变量的示例代码?这样做有什么好处吗?

有时您不想声明属性,而只想使用私有ivar

另一方面,如果存在属性声明,则除了在访问器的实现中,没有理由直接访问ivar


有时人们想绕过存取器的副作用,直接使用ivar。不过,这通常是架构缺陷的标志。

我有两次直接使用ivar

  • 重写getter或setter时。如果在getter或setter中使用self.blah属性,则会创建一个无限循环

  • 在类的init方法中


  • 为什么要在init方法中直接访问IVAR?理论上,如果需要在那里做任何事情,也应该在
    dealloc
    中直接使用IVAR(ARC处理大部分基本内存管理).我以前读过一些东西,我记不清了,但这与getter和setter是完全实例化还是其他不确定因素有关。JimMiely.一些人认为调用来自构建/销毁的访问器是有问题的,因为覆盖访问器的子类可能还没有完全初始化,并且不期望早期调用。还需要仔细考虑KVO,尤其是在 DELOLC/中,仍然可以有观察者,但是对象的状态是未定义的。使用私有iVar比声明属性有什么好处?@Jimmery iVar用于定义对象的私有状态。使用ARC时,使用私有财产几乎没有什么好处,因为对IVAR的所有权处理与财产一样。属性污染了类的API,所以我建议不要在内部使用它们。在.m文件中声明的属性如何?如果我理解正确,这些属性是私有属性。这些私有财产会污染这个类的API吗?@Jimmery是的。虽然外部代码看不到它们,但它们仍然向运行时显示访问器。如果一个基类私下定义了一个属性“foo”,那么没有任何子类或类别可以这样做(或者使用同名的普通方法)。顺便说一句,这个类必须有几十个副本:[对于“[objc]ivar accessor”)@monolo我在google和stackoverflow中搜索了我的问题,但因为我没有使用“iVar”这个词,所以我找不到任何结果。我倾向于在目标C中找到大量重复的问题,特别是一些错误消息(例如SIGABRT和EXC_BAD_ACCESS)。这向我表明,该语言给许多人带来了同样的问题,但我可能错了。你认为这是该语言的问题吗?不,我不认为这是该语言的问题,但Objective-C与其他语言不同,部分原因是它的悠久历史和Smalltalk的传统。因此,实例变量(懒散地缩写为IVAR)就是这样称呼的,而其他语言选择了其他方式来命名同一事物。老实说,这令人困惑。很好地介绍Objective-C的特性(毕竟没有那么多)会很有用!顺便说一句,如果对“[objc]实例变量访问器”进行搜索,似乎会产生类似的结果,所以这个术语是活蹦乱跳的。