iOS,使用下划线vs直接使用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];

为什么?

非常感谢!

你只能在initdealloc处理你的ivars,或者在实现细节中绝对需要的地方处理你的ivars(比如在访问器本身内部,或者实际需要内存地址的地方)。 除了那些地方,你应该总是使用访问者,这意味着[self foo]而不是_foo

self.foo只是实际调用的语法糖,也就是[self foo] 。 理解self.foo是一个标准的ObjC消息发送,意思与[self foo]完全一样。 按照惯例,在引用属性时只应使用点语法。

在ARC之前,直接使用ivars是我经历崩溃的头号原因。 在没有ARC的情况下直接分配给伊娃的可能性很快在整个项目范围内达到100%。

自ARC以来,我仍然认为你应该总是使用访问器(除了上面给出的例外),但是原因更为微妙。 其主要原因是可以在当前类,子类或KVO(完全在您的代码之外发生)中定制访问者。 如果你直接进入伊娃,那么你会绕过这个。 例如,说这个属性是懒惰创build的(这很常见)。 那么如果你在使用伊娃之前,你会得到微妙的错误。 所以你必须记住,对于这个属性,总是使用访问器。 同样,您可能会调用setNeedsDisplay或发布通知等。

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

如果你有一条规则:“我将使用访问器来访问需要它的属性,但不能访问那些不需要的属性”,那么查看代码几乎是不可能的,并且知道它是否正确。 以前的开发者是使用伊娃吗?因为这是必需的,或者只是因为他觉得这样吗? 你可以改变吗? 这很难知道。

因此,即使是后ARC,使用访问者一贯是良好的防御性编程,我强烈推荐它。

selfJAVA就是this keyword

它访问当前对象,也是一个指向对象的指针。

有关self阅读本教程的更多信息

Objective c _ObjeName被称为iVar

在实现中声明的实例variables隐式隐藏( 私有 ),可见性无法更改- @public, @protected and @private不会产生编译器错误( 至less使用当前的Clang ),但是被忽略。

例如 :

不同之间

1) NSString *someString = _name;

2) NSString * someString = self.name;

假设你在你的.m文件中有这一行(并没有任何重写方法来直接访问_name)

 @synthesize name = _name; 

这意味着当您尝试访问它时,属性name (self.name)将使用variables_name。 在这种情况下, self.name等于_name


但是如果你有名字的dynamic属性,像这样:

 -(NSString)name{ return @"1234"; } 

那么有一个区别。 self.name将始终返回1234,但_name不能等于此值。

例:

 _name = @"555"; NSLog(_name); NSLog(self.name); 

结果:

 2012-02-09 14:27:49.931 ExampleApp[803:207] 555 2012-02-09 14:27:49.933 ExampleApp[803:207] 1234 

上面的例子我从这个问题得到。

_mutArray是iVar,self.mutArray通过获取器和setter来访问属性,这些getter和setter是在@synthesize属性时为您创build的。 你可以覆盖这些getter和setter到适当的自定义的东西。 在你的例子中,你的财产被设置为强壮,这将增加一个保留到你的财产。 所以self.mutarray = [[NSMutableArray alloc] init]; 会做这样的事情(除非你改写属性的setter):

 -(void)setMutarray:(NSMutableArray*)_mutArray{ if(_mutArray != mutArray){ [mutArray release]; mutArray = nil; mutArray = [_mutArray retain]; } } 

为了向数组添加对象,您只需要访问iVar,而不是属性,除非您在getter中进行自定义操作。 例如,你的getter可能看起来像这样:

 -(NSMutableArray*)mutArray{ if(!mutArray){ self.mutArray = [[[NSMutableArray alloc] init] autorelease]; } return mutArray; } 

这样你可以确保你总是有一个真正的数组来添加对象。 如果这是你想要使用[self.mutArray addObject:object];

所以,除非你想在getter或setter中做一些自定义的事情,你只是想访问iVar。