2011-06-29 100 views
3

例如,我在iPhone项目的应用程序委托中看到过类似的代码。@synthesize variable = _variable会做什么?

什么是下划线的变量?我可以将它用作变量的setter和getter吗?

也释放变量时应该使用:

[variable release]; 

[_variable release]; 

感谢。

+1

[在Objective C中使用下划线前缀属性名称](http://stackoverflow.com/questions/3521254/prefixing-property-names-with-an-underscore-in-objective-c)和[如何在变量工作前面的下划线](http://stackoverflow.com/questions/822487/)和[下属性名称前缀](http://stackoverflow.com/questions/5582448/underscore-prefix- on-property-name)和[为什么你为一个实例变量使用下划线而不是它的相应属性?](http://stackoverflow.com/questions/2371489/) –

+0

没有人提到要释放哪个变量! – Samssom

回答

4

在一些编码约定中,实例变量之前的下划线用于能够快速区分它们与其他变量。它还有助于避免与方法和子类方法中的局部变量发生命名冲突。

@synthesize variable = _variable 

创建一个setter和getter来设置/获取您在此例中设置的变量_variable。所以外部访问使用像object.variable这样的代码,它真的只是返回_variable。然而这个类通常在内部使用_variable。

+0

这是一个旧帖子,但我想澄清。这样做是否会创建setter和getter,所以只要在任何地方使用object.variable都会像它应该那样工作?或者我还需要另外定义一个setter和getter? – muttley91

+0

@rar如果你拥有'@ property'和'@ synthesize',那么setter和getter就是为你创建的。之后你可以很好地访问object.variable。 –

+0

哇,我写了一堆不必要的代码(因为我写了getters)。谢谢! – muttley91

3
@synthesize variable = _variable; 

属性名称为“variable”,备份它的实例变量名为“_variable”。您应该使用访问器-variable-setVariable:,而不是直接访问伊娃,除非在-init和-dealloc中使用_variable

1

在您的示例变量是一个属性和_variable是一个实例变量。为了简单起见,我们可以说通过合成你本质上是指示属性(在我们的情况下是变量)将使用实例变量(在我们的例子中是_variable)来存储和检索值。你真正在做的是指示编译器创建符合属性声明中给出的规范的实现。

当您使用属性时,建议的释放方式是将其分配为零。这实质上会释放对象,并将实例变量设置为nil而不是悬挂指针。

如果你没有使用属性,那么你可以调用实例变量的版本,然后理想情况下你想将它设置为零。

相关问题