self.variableName与_variableName对@sysnthesize variableName

Ray*_*oIL 8 objective-c synthesize

可能重复:
cocoa objective-c类中变量前面的下划线如何工作?


注意:对于那些试图理解这一点的人来说,我想出了我的困惑的根源.在.h,我有:

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

@property (strong, nonatomic) className  *variableName;
...
Run Code Online (Sandbox Code Playgroud)

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

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

@property (strong, nonatomic) className  *variableName;
...
Run Code Online (Sandbox Code Playgroud)

然后,在类'.m中,self.variableName和_variableName是等价的


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

我的理解是Xcode 4.5+将创建一个_variableName相当于的默认访问器,self.variableName并且唯一不使用的原因@synthesize variableName是为了避免iVars和传入变量之间的混淆,对吗?

对我来说,只是使用self.variableName访问iVar似乎是最直接和明确的,你正在寻找哪个变量.除了打字_self.,使用是否有优势_variableName

eye*_*ire 17

我的理解是Xcode 4.5+将创建一个默认的访问者"_variableName",它等同于self.variableName,不使用"@synthesize variableName"的唯一原因是为了避免iVars和传入变量之间的混淆,对吗?

在这种情况下,_variableName不是访问器,它是由编译器自动生成并在自动@synthesized setter和getter中使用的ivar.通常,最好尽可能使用访问器(即self.variableName),以便键值观察和绑定等操作适用于该属性.

当您直接访问ivar时,可以通过直接内存访问来访问它,就像访问结构中的数据一样.它只需要拥有ivar的对象的指针,抵消内存地址并尝试读取或写入该位置的内存.使用点表示法(self.variableName)调用访问器方法来设置或获取该属性,并且可以在此过程中执行许多不同的操作,例如:

1)锁定:如果属性将在多个线程中使用并且是atomic属性,则运行时将自动执行某些锁定以确保不会从多个线程同时访问该属性.如果您的对象不打算在多个线程上使用,则可以nonatomic在属性声明中提供提示,以便合成的访问器跳过锁定.

2)键-值通知:针对属性的默认设置器调用-willChangeValueForKey:-didChangeValueForKey:,其中,当所述属性更改发出通知.如果使用绑定以及任何其他键值观察,这对于任何正确更新都是必要的.

3)自定义访问者行为:如果您最终编写自己的setter和getter,那么您在其中实现的任何自定义内容.

从技术上讲,直接访问ivar比使用访问器更快,但是很少会出现显着的性能差异,并且可能是过早优化的情况.即使你不觉得你会使用上述马上上市的好处,它可能会更好反正用的访问者,这样如果以后决定,你需要一些这个功能,你不必改变每个实例访问该变量(并可能在该过程中创建意外的新错误).

此外,如果您直接访问ivars并最终将类重构为类别或子类,则会变得混乱,因为您通常必须将ivar声明为@protected变量.如果您使用访问器,则不必执行此操作.

一般情况下,我尽量只访问实例变量直接init,dealloc和属性的访问.许多工程师通过这个经验法则去,因为有时这种情况发生在存取定制的东西可能会导致意外的行为,而对象是init"ING或dealloc" ING.例如,如果访问器中的任何内容导致某些内容retainrelease您的对象或甚至形成对它的归零弱引用,则如果使用它将导致崩溃dealloc.


das*_*ght 5

在最新的Xcode @synthesize是可选的.默认情况下,省略@synthesize与写入相同

@synthesize someName = _someName;
Run Code Online (Sandbox Code Playgroud)

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

@synthesize someName = someSpecialName;
Run Code Online (Sandbox Code Playgroud)

当您self.variableName用来访问变量时,您将浏览一个属性,这是一个为您访问实例变量的简短方法.尽管方法调度非常快,但它可能会为您执行其他服务,例如同步对变量的访问(在属性声明中指定atomic或未指定时就是这种情况nonatomic).在这种情况下,访问self.variableName速度会稍慢.如果在紧密循环中完成,这可能会产生影响.这就是为什么有时你想通过使用直接访问底层实例变量_variableName.


归档时间:

查看次数:

9289 次

最近记录:

12 年,10 月 前