<分区>
这个问题已经被问了很多,但这个问题是为了获取您何时使用这些方法的示例。请使用 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];
为什么?!
非常感谢!
您应该只在 init
和 dealloc
中或在实现细节绝对需要的地方(例如访问器本身内部,或您实际需要的地方)处理您的 ivars内存地址)。除了那些地方,您应该始终使用访问器,这意味着 [self foo]
而不是 _foo
。
self.foo
只是实际调用的语法糖,即 [self foo]
。重要的是要理解 self.foo
是标准的 ObjC 消息发送,与 [self foo]
的含义完全相同。按照惯例,您应该只在引用属性时使用点语法。
根据我的经验,在 ARC 之前,直接使用 ivars 是导致崩溃的第一大原因。在没有 ARC 的情况下直接分配给 ivar 时,您搞砸的可能性在程序范围内迅速接近 100%。
自 ARC 以来,我仍然认为您应该始终使用访问器(除了上面给出的异常(exception)情况),但原因更加微妙。这样做的主要原因是访问器可以在当前类、子类中或通过 KVO(完全发生在您的代码之外)进行自定义。如果你直接访问ivar,那么你将绕过它。例如,假设该属性是延迟创建的(这很常见)。然后,如果您在创建 ivar 之前使用它,就会出现细微的错误。因此,对于该属性,您必须记住始终使用访问器。同样,您可以调用 setNeedsDisplay
或发布通知等。
如果您有一个简单的规则说“我将始终使用访问器”,那么很容易查看代码并知道它是正确的。在少数情况下,您需要绕过访问器,_
会说“嘿,注意这里,我在做一些奇怪的事情。”
如果您有一条规则“我将为需要它的属性使用访问器,而不为不需要它的属性使用访问器”,那么几乎不可能查看代码并知道它是否正确。以前的开发人员使用 ivar 是因为它是必需的还是仅仅因为他喜欢它?改不改?很难知道。
因此,即使是在 ARC 之后,始终如一地使用访问器也是很好的防御性编程,我强烈推荐它。