self.variableName与_variableName与@sysnthesize VARIA

2019-08-05 05:37发布

可能重复:
如何在一个变量前面的下划线在可可Objective-C类工作?


注:对于乡亲们四处想明白这一点,我想,我的问题的根源。 在.H,我有:

...
@interface myClass : parentClass {
className *variableName:
}

@property (strong, nonatomic) className  *variableName;
...

这导致self.variableName和_variableName是在.M两个不同的变量。 我需要的是:

...
@interface myClass : parentClass {
className *_variableName:
}

@property (strong, nonatomic) className  *variableName;
...

然后,在类的.M,self.variableName和_variableName是等价


在全新的Xcode的4.5+,与ARC,针对iOS 5.0及项目,有一个明显的优势(运行时的效率,速度等)使用_variableNameself.variableName与旧式@synthesize variableName

我的理解是,Xcode中4.5+将创建一个默认的访问_variableName等效于self.variableName ,而不是使用的唯一原因@synthesize variableName是为了避免实例变量和传入的变量,正确之间的混乱呢?

对我来说,只是用self.variableName访问伊娃似乎是最直接和明确,以你要找哪个变量。 除了打字_self. ,是有一个优势,使用_variableName

Answer 1:

我的理解是,Xcode中4.5+将创建一个默认的访问“_variableName”,也就是相当于self.variableName,唯一的理由不使用“@synthesize VARIABLENAME”是为了避免实例变量和传入的变量,正确之间的混乱呢?

在这种情况下, _variableName不存取,这是由编译器自动生成,并在自动@synthesized setter和getter使用的ivar。 一般情况下,它被认为是最好尽可能(即使用存取self.variableName ),使之类的东西键值观察和绑定,物业工作。

当你直接访问伊娃,它是通过直接存储器访问,你会在结构中访问数据以同样的方式访问。 它简单地取指针为拥有的ivar,抵消了存储器地址,并尝试读取或写入到该位置处的存储器中的对象。 使用点符号( self.variableName )调用存取方法来设置或获取财产,可以做一些沿途不同的东西,如:

1) 锁定 :如果属性会在多个线程中使用,是一种atomic特性,运行时会自动做一些锁定,以确保该财产是不是在从多个线程同时访问。 如果并不意味着你的对象将在多个线程中使用,你可以给nonatomic暗示你的财产声明,使合成存取跳过锁定。

2) 键-值声明 :用于属性的默认设置器调用-willChangeValueForKey:-didChangeValueForKey:当属性被改变,其发出通知。 这是必要的,如果使用绑定任何正确更新,以及其他任何键值观察。

3) 自定义访问器的行为 :如果你最终编写自己的getter和setter方法,你中的那些实现的任何自定义的东西。

从技术上讲,访问伊娃直接比使用存取速度更快,但也有它将使显著的性能差异,很可能是过早优化的情况下,极少数的情况。 即使你不觉得你会使用上述马上上市的好处,它可能会更好反正用的访问者,这样如果以后决定,你需要一些这个功能,你不必改变每个实例访问该变量的(以及可能被创建的过程中意外的新bug)。

此外,如果您是直接访问实例变量,最终重构你的类进行分类或子类,它就会变得混乱,因为你通常必须声明伊娃作为@protected变量。 你不会有,如果你正在使用的访问器来做到这一点。

一般情况下,我尽量只访问高德直接initdealloc ,和属性的访问。 许多工程师通过这个经验法则去,因为有时在对象被认为发生在存取定制的东西可能会导致意外的行为init “荷兰国际集团或dealloc ”荷兰国际集团。 例如,如果在存取什么东西引起对retainrelease你的对象,甚至形成归零弱引用时,就会造成崩溃,如果在使用dealloc



Answer 2:

在最新的Xcode @synthesize是可选的。 默认情况下,省略@synthesize是一样的书写

@synthesize someName = _someName;

使用的唯一原因@synthesize重命名创建用于存储所述属性的值的实例变量,例如

@synthesize someName = someSpecialName;

当您使用self.variableName访问一个变量,你经过一个属性,它是访问实例变量为大家作一个简短的方法。 虽然方法分派是非常快的,它可以完成你的附加服务,如同步访问变量(这是在指定的情况下, atomic或不指定nonatomic在财产申报)。 在这样的情况下,通过接入self.variableName会略慢。 如果在一个紧密的循环中完成,这可能有所作为。 这就是为什么你有时候想直接通过访问底层的实例变量_variableName



文章来源: self.variableName vs. _variableName vs. @sysnthesize variableName [duplicate]