Objective c 保留财产何时释放?
我有这样的财产:Objective c 保留财产何时释放?,objective-c,ios,ios5,properties,Objective C,Ios,Ios5,Properties,我有这样的财产: @property(nonatomic,retain) NSString *porpertyList; @synthesize porpertyList = _porpertyList; - (void)dealloc { [_porpertyList release]; } 如果我这样做_porpertyList=@;在我的应用程序中。财产被释放了 //编辑 现在我不明白什么时候应该使用这个@synthesis porpertyList=\u porpertyList
@property(nonatomic,retain) NSString *porpertyList;
@synthesize porpertyList = _porpertyList;
- (void)dealloc
{
[_porpertyList release];
}
如果我这样做_porpertyList=@;在我的应用程序中。财产被释放了
//编辑
现在我不明白什么时候应该使用这个@synthesis porpertyList=\u porpertyList 如果对变量名使用
@属性
选项,则应使用
self.propertyList=@”“
而不是\u propertyList=@”“
。使用self.propertyList
将释放您分配给它时使用的任何以前的内存如果您对变量名使用@property
选项,则应使用
self.propertyList=@”“
而不是\u propertyList=@”“
。使用self.propertyList
将释放您分配给它时它使用的任何以前的内存\u porpertyList=@“
将不会释放任何内容。如果您想发布,可以使用self。porpertyList=nil
。这将正确地释放它。\u porpertyList=@“
不会释放任何内容。如果您想发布,可以使用self。porpertyList=nil
。这将正确释放它。取决于您使用的内存型号。如果您使用的是ARC,则无需编写dealloc来释放保留的属性,这是为您完成的。如果不使用ARC,则要释放保留特性的变量:
- (void) dealloc {
[_propertyList release];
[super dealloc];
}
这里需要注意两件事:
[super dealoc]代码>
取决于您使用的内存模型。如果您使用的是ARC,则无需编写dealloc来释放保留的属性,这是为您完成的。如果不使用ARC,则要释放保留特性的变量:
- (void) dealloc {
[_propertyList release];
[super dealloc];
}
这里需要注意两件事:
[super dealoc]代码>
如果您访问这样的属性
self.property=@"";
实际上,您正在使用setter方法(这是由于@synthesis而自动创建的)。因此,在这种情况下,旧对象被释放,新对象被分配并保留
如果您使用
@synthesize property= _property;
那么如果你打电话
_property=@"";
然后,您只需为属性指定新值。当时没有任何东西被释放
因此,在您的dealloc
方法中,您有一些选择:
-(void)dealloc
{
self.property=@"";//old value released, new value is @""
self.property=nil;//old value released, new value is nil
[_property release]; //old value released
[super dealloc];
}
如果您访问这样的属性
self.property=@"";
实际上,您正在使用setter方法(这是由于@synthesis而自动创建的)。因此,在这种情况下,旧对象被释放,新对象被分配并保留
如果您使用
@synthesize property= _property;
那么如果你打电话
_property=@"";
然后,您只需为属性指定新值。当时没有任何东西被释放
因此,在您的dealloc
方法中,您有一些选择:
-(void)dealloc
{
self.property=@"";//old value released, new value is @""
self.property=nil;//old value released, new value is nil
[_property release]; //old value released
[super dealloc];
}
每当你合成一个属性。。。您将其保留计数增加1..这就是为什么您的dealloc中有release
Using self.propertyList = something
及
是非常不同的东西,在使用属性时应避免使用后一种。。
这就是为什么porpertyList=\u porpertyList是否存在..这样您就不会使用propertyList而不是self.porpertyList
原因是..popertyList是指针..
当您执行self.porperty=something时,您可以为自己制作该对象的单独副本(而不是@的情况)
但是如果你做了popertyList=某件事。。您让它指向另一个对象,这样就弄乱了它最初拥有的整个保留计数,这会使您的程序行为异常
每当你合成一个属性。。。您将其保留计数增加1..这就是为什么您的dealloc中有release
Using self.propertyList = something
及
是非常不同的东西,在使用属性时应避免使用后一种。。
这就是为什么porpertyList=\u porpertyList是否存在..这样您就不会使用propertyList而不是self.porpertyList
原因是..popertyList是指针..
当您执行self.porperty=something时,您可以为自己制作该对象的单独副本(而不是@的情况)
但是如果你做了popertyList=某件事。。你让它指向另一个对象,这样就弄乱了它最初拥有的整个保留计数,这会使你的程序行为异常。对不起我的错误,现在替换对不起我的错误,现在替换有用的hanks。但是现在我不明白什么时候应该使用这个@synthesis porpertyList=\u porpertyList?读一读,看看这是否对你来说是错误的,必须设置self.property=nil,否则它将不会非常有用(@“不是nil…)i ment@)作为某种字符串,他也在分配它。所以self.propertyList=@“somestring”谢谢你的帮助。但是现在我不明白什么时候应该使用这个@synthesis porpertyList=\u porpertyList?读一读,看看这是否对你来说是错误的,必须设置self.property=nil,否则它将不会非常有用(@“不是nil…)i ment@)作为某种字符串,他也在分配它。因此self.propertyList=@“somestring”建议不要在dealloc中使用setter(包括通过点表示法隐式使用setter),因为它实际上是在一个part deallocate对象上调用方法。如果有人对你的对象进行子类化并实现了一个更复杂的setter,尤其是考虑到你的dealloc将在子类完全完成之后发生,那么即使你对自己很小心,也可能会发生这种情况。建议不要使用setter(包括通过点符号隐式地)在dealloc中,因为它实际上是在调用part deallocate对象上的方法