保留财产被释放后?

时间:2012-01-25 13:51:32

标签: objective-c ios ios5 properties

我有这样的财产:

@property(nonatomic,retain) NSString *porpertyList;

@synthesize porpertyList = _porpertyList;

- (void)dealloc
{
[_porpertyList release];
}

如果我这样做_porpertyList = @“”;在我的应用程序中财产被释放?

//被修改 现在我不明白我什么时候应该使用这个@synthesize porpertyList = _porpertyList; ?

5 个答案:

答案 0 :(得分:2)

取决于您使用的内存模型。如果您正在使用ARC,则无需编写dealloc来释放保留的属性,这是为您完成的。如果您不使用ARC,则需要释放保留属性的变量:

- (void) dealloc {
    [_propertyList release];
    [super dealloc];
}

这里有两点需要注意:

  1. 您想在此处释放变量,而不是将属性设置为nil。这可以避免使用setter时出现的副作用(自定义行为,kvo通知)。
  2. 不要忘记致电[super dealloc];

答案 1 :(得分:2)

如果您访问此属性

self.property=@"";

你实际上正在使用setter方法(由于@synthesize而自动创建)。因此,在这种情况下,旧对象被释放,新对象被分配和保留。

如果您使用

合成了您的财产
@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];
}

答案 2 :(得分:1)

@synthesize porpertyList = _porpertyList;

每当你合成一个属性时......你的保留计数增加1 ..这就是你在dealloc中释放的原因。

Using self.propertyList = something

 porpertyList = something 

是非常不同的东西,使用属性时应避免使用后者。 这就是porpertyList = _porpertyList; 的原因所以你没有使用propertyList而不是self.porpertyList

原因是...... popertyList是一个指针..

当你self.porperty = something时..你为自己制作一个单独的副本(不是@“”) 但是如果你做popertyList =某事......你会指向另一个对象,从而弄乱它最初的整个保留计数,这会使你的程序表现得很奇怪..

答案 3 :(得分:0)

如果对变量名使用@property选项,则应使用 self.propertyList = @""而不是_propertyList = @""。使用self.propertyList将释放它在分配给它时使用的任何先前的内存

答案 4 :(得分:0)

_porpertyList = @""不会发布任何内容。如果要发布,可以使用self. porpertyList = nil。这将正确释放它。