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];
}
这里需要注意两件事:

  • 您希望在此处释放变量,而不是将属性设置为nil。这避免了使用setter时可能出现的副作用(自定义行为、kvo通知)
  • 别忘了调用
    [super dealoc]

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

    - (void) dealloc {
        [_propertyList release];
        [super dealloc];
    }
    
    这里需要注意两件事:

  • 您希望在此处释放变量,而不是将属性设置为nil。这避免了使用setter时可能出现的副作用(自定义行为、kvo通知)
  • 别忘了调用
    [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对象上的方法