我正在学习有关财产,我阅读了各种文件,但仍然不清楚财产是如何运作的,并且遇到了困扰我的情景。我创建了一个示例应用程序,其中我创建了一个属性,如下所示:
@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];
没有任何内存泄漏或悬空参考,它工作得很好,怎么样? 任何人都可以解释属性是如何工作的吗?当我们使用属性时如何分配和释放内存?
答案 0 :(得分:1)
第一个问题,
由于您将实例设置为变量本身而不是属性,因此您必须分配(或保留)给定实例,如果您将此变量赋予自动释放对象,稍后该属性将变为僵尸
第二个问题
由于该属性已经保留了实例,因此没有相似之处,另一个保留会将保留计数增加一个,因此您将有一个额外的保留计数,不会被释放。
第三个问题
正如我之前所说,该属性将保留该实例,因此将自动发布的实例传递给它将没有问题
这是一个示例retain属性setter
- (void) setProperty:(BookItem *)prop
{
if(_property != prop)
{
[_property release];//release old
_property = prop;
[prop retain]; //retain new
}
}