iOS,使用下划线直接使用iVar

jgv*_*gvb 9 iphone cocoa-touch objective-c ios ivar

这已被问了很多,但这个问题是为了获得何时使用这些方法的例子.请使用setter和getter无限循环以外的示例

例.

.h -
@property(nonatomic, strong)NSMutableArray* mutArray
.m -
@synthesize mutArray= _mutArray;

1)我想要:
_mutArray = [[NSMutableArray alloc] init];
或者
self.mutArray=[[NSMutableArray alloc] init];
我为什么要做每一个,有什么区别?!

2)如果我想向它添加一个对象......
[_mutArray addObject:object];
或者
[self.mutArray addobject:object];

为什么?!

非常感谢!

Rob*_*ier 12

您应该只应对您的高德initdealloc的或在实施细节绝对需要(如访问本身,或者你实际需要的存储器地址内).除了那些地方,你应该总是使用访问者,这意味着[self foo]而不是_foo.

self.foo只是实际调用的语法糖,这是[self foo].重要的是要理解这self.foo是一个标准的ObjC消息发送,并且意味着完全相同的事情[self foo].按照惯例,您只应在引用属性时使用点语法.

在我的经验中,预先ARC,直接使用伊娃已成为崩溃的首要原因.在没有ARC的情况下直接分配到ivar时,你搞砸的可能性很快超过了程序范围的100%.

自ARC以来,我仍然认为你应该总是使用访问器(除了上面给出的例外),但原因更为微妙.它的主要原因是可以在当前类,子类中或通过KVO(完全在代码之外发生)自定义访问器.如果您直接访问ivar,那么您将绕过它.例如,假设该属性是懒惰创建的(这很常见).然后,如果您在创建之前使用ivar,您将获得微妙的错误.因此,您必须记住,对于该属性,始终使用访问者.同样,您可以致电setNeedsDisplay或发布通知等.

如果你有一个简单的规则,说"我将永远使用访问器",那么很容易看到代码并知道它是正确的.在少数情况下,你需要规避访问者,_"嘿,请注意这里,我正在做一些奇怪的事情."

如果你有一个规则"我将使用访问器来获取需要它的属性,而不是那些不需要它的属性",那么几乎不可能查看代码并知道它是否正确.之前的开发人员是否使用了ivar,因为它是必需的,或者只是因为他觉得这样?你能改变它吗?这很难知道.

因此,即使是后ARC,使用访问器始终是良好的防御性编程,我强烈推荐它.