的iOS,使用下划线VS直接使用的ivar(闭合)(iOS, using underscore vs

2019-08-18 00:55发布

这已被问了很多,但这个问题是得到的,当你将使用每一种方法的例子。 请使用比二传手其他例子和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];

为什么?

非常感谢!

Answer 1:

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

self.foo是围绕着实际调用,它只是语法糖[self foo] 要了解这一点很重要self.foo是一个标准的ObjC消息发送,并表示完全一样的东西[self foo] 按照惯例,参照属性时,你应该只使用点语法。

弧前,直接使用高德的是在我的经验崩溃的首要原因。 直接到没有ARC伊娃分配,当你搞砸了的可能性在程序的范围迅速接近100%。

由于ARC,我仍然认为,你应该总是使用存取器(与上面给出的例外),但原因则比较含蓄。 它的主要的原因是,一个访问器可被定制,无论是在当前类,在子类中,或者经由KVO(其完全发生代码之外)。 如果你直接访问实例变量,那么你将绕过这一点。 例如,假设该属性懒洋洋地创建(这是很常见的)。 然后,如果你使用埃法尔的创建之前,你会得到微妙的错误。 所以,你一定要记住,对于财产,始终使用访问。 同样,您可以调用setNeedsDisplay或张贴通知,等等。

如果你有一个简单的规则,说:“我会一直使用存取”,那么它很容易看代码,知道它是正确的。 在少数情况下,你需要规避的访问中, _说:“哎,这里要注意,我在做一些奇怪的。”

如果你有一个规则,“我会用存取它为需要的属性,而不是那些不”,那么它几乎是不可能的看代码,并知道它是否是正确的。 难道以前的开发利用伊娃因为这是必需的或只是因为他喜欢它的感觉? 你可以改变它呢? 这是很难知道的。

因此,即使后ARC,使用访问始终是很好的防守编程和我强烈推荐它。



Answer 2:

selfkeyword喜欢this keywordJAVA

它访问当前对象,并且还它是一个指向的对象。

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

_ObjeNameiVarObjective c

在实现声明实例变量隐式隐藏的( 有效私营 )和可见性无法改变- @public, @protected and @private不产生编译器错误( 与当前锵至少 ),但被忽略。

例如 :

之间的不同

1) NSString *someString = _name;

2) NSString * someString = self.name;

假设你在.m文件这行(不要有任何重写的方法能够直接访问_name)

@synthesize name = _name;

这意味着,物业name (self.name)将使用变量_name当您尝试访问它。 在这种情况下self.name等于_name


但是,如果你有名字的动态特性,是这样的:

-(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

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



Answer 3:

_mutArray是伊娃,self.mutArray访问,通过它为您创建,当你@synthesize属性的getter和setter属性。 您可以覆盖这些getter和setter由于定制的东西。 在你的榜样,你属性设置为强,增加了一个保留你的财产。 所以self.mutarray = [[NSMutableArray里的alloc] INIT]; 会做这样的事情(除非你在写属性的setter):

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

对于将对象添加到一个数组,你会想只访问伊娃,没有财产,除非你是在吸气做一些定制。 例如你的getter可能是这样的:

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

通过这种方式,你可以确保您始终有一个真正的数组对象添加到。 如果是这样的话,你可能需要使用[self.mutArray ADDOBJECT:对象];

所以,除非你想要做的事定制的getter或setter你只是想访问伊娃。



文章来源: iOS, using underscore vs using iVar directly [closed]