我得到@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开发的一些原因感到困惑。
答案 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
的实例变量,那么直接使用它而不是访问者就太容易了,这意味着当你覆盖那个访问者时它不会影响所有它应该的代码。