0

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

@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(nonatomic,retain)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] 行显示内存泄漏。这里的问题是:为什么在这里显示内存泄漏?这行是否不等于以下代码行:

[strValue release];
[strValue retain];

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

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

在 dealloc 我写道:

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

它工作得很好,没有任何内存泄漏或悬空引用,怎么样?谁能解释一下属性实际上是如何工作的?当我们使用属性时,内存是如何分配和释放的?

4

1 回答 1

1

第一个问题,

由于您将实例设置为变量本身而不是属性,那么您将不得不分配(或保留)给定的实例,如果您给这个变量一个自动释放的对象,稍后属性将变成僵尸

第二个问题

不,它不相似,因为该属性已经保留了实例,另一个保留将使保留计数增加一个,因此您将拥有一个永远不会释放的额外保留计数。

第三个问题

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

这是一个示例保留属性设置器

- (void) setProperty:(BookItem *)prop
{
    if(_property != prop)
    {       
        [_property release];//release old
        _property = prop;
        [prop retain]; //retain new
    }
}
于 2012-06-25T09:51:35.843 回答