@synthesize variable = _variable真的有用吗?它非常有用吗?

时间:2012-02-01 04:23:20

标签: objective-c ios

我得到@synthesize - 变量会自动为我的.h文件中定义的@property创建访问器方法,使用= _variable告诉编译器我的名字用于我的支持变量,但它对我做了什么吗? 我几乎一直在使用像

之类的东西来分配和读取我的类变量
self.variableName = somethingElse

self.someLabel.text = self.someString

我可以改为(假设所有@synthesize语句都是正确的,等等)做类似的事情吗?

_variableName = somethingElse

我可以使用_variable而不是担心它而不是使用self.variable吗?我应该在[_variable release]dealloc中使用[self.variable release]吗?

我仍然对目标c / cocoa / iOS开发的一些原因感到困惑。

2 个答案:

答案 0 :(得分:4)

@synthesize varible1相当于@synthesize variable1 = variable1 - 它表示您正在为实例变量和属性提供相同的名称。

当您说@synthesize variable1 = variable2时,variable1是属性的名称,variable2是实例变量的名称。

使用上述@synthesize声明,如果您说:

self.variable1 = something; 

然后,如果属性具有“retain”属性,则保留对象something(并释放variable1中的任何旧对象)。

但如果你说:

variable2 = something;

然后没有发生保留/释放。很可能这会导致丢失的对象错误。

关于dealloc中的发布,您可以说

[self.variable1 release];

[variable2 release];

虽然后者是首选。

你也可以说:

self.variable1 = nil;

这将释放变量并且为零。

但请注意,前两个表单应dealloc中使用。

答案 1 :(得分:1)

这样做的原因是这个。

假设您在ARC中覆盖了一个存取器。你是这样写的:

- (void) setMyValue:(NSString *)myValue
{
    _myValue = myValue;
}

如果你还没有这样做:

@synthesize myValue = _myValue;

您必须重新命名进入的参数,以便不影响您的实例变量。

同样值得尊敬的“Hot Licks”注意到,如果你留下名为myValue的实例变量,那么直接使用它而不是访问者就太容易了,这意味着当你覆盖那个访问者时它不会影响所有它应该的代码。