财产如何运作?

时间:2012-06-25 09:47:20

标签: iphone objective-c properties

我正在学习有关财产,我阅读了各种文件,但仍然不清楚财产是如何运作的,并且遇到了困扰我的情景。我创建了一个示例应用程序,其中我创建了一个属性,如下所示:

@property(nonatomic,retain)NSString *strValue;

并合成它:

@synthesize strValue;

1)第一种情景:

在viewDidLoad中我写道:

strValue = [[NSString stringWithFormat:@"value"] retain];

在dealloc中我写道:

NSLog(@"str value : %@",self.strValue);
[self.strValue release];

它工作正常,没有任何泄漏。我的问题是:当我创建保留属性strValue(@property(非原子,保留)NSString * strValue;)时保留的内存发生了什么?

2)第二种情景:

在viewDidLoad中我写道:

self.strValue = [[NSString stringWithFormat:@"value"] retain];

在dealloc中我写道:

NSLog(@"str value : %@",self.strValue);
[self.strValue release];

它在self.strValue = [[NSString stringWithFormat:@“value”] retain] line中显示内存泄漏。这里的问题是:为什么它在这里显示内存泄漏?这行是否等同于以下代码行:

[strValue release];
[strValue retain];

3)第三种情景: 在viewDidLoad中我写道:

self.strValue = [NSString stringWithFormat:@"value"];

在dealloc中我写道:

NSLog(@"str value : %@",self.strValue);
[self.strValue release];

没有任何内存泄漏或悬空参考,它工作得很好,怎么样? 任何人都可以解释属性是如何工作的吗?当我们使用属性时如何分配和释放内存?

1 个答案:

答案 0 :(得分:1)

  

第一个问题,

由于您将实例设置为变量本身而不是属性,因此您必须分配(或保留)给定实例,如果您将此变量赋予自动释放对象,稍后该属性将变为僵尸

  

第二个问题

由于该属性已经保留了实例,因此没有相似之处,另一个保留会将保留计数增加一个,因此您将有一个额外的保留计数,不会被释放。

  

第三个问题

正如我之前所说,该属性将保留该实例,因此将自动发布的实例传递给它将没有问题

这是一个示例retain属性setter

- (void) setProperty:(BookItem *)prop
{
    if(_property != prop)
    {       
        [_property release];//release old
        _property = prop;
        [prop retain]; //retain new
    }
}