【问题标题】:How property works?财产如何运作?
【发布时间】:2012-06-26 13:36:52
【问题描述】:

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

@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];

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

【问题讨论】:

    标签: iphone objective-c properties


    【解决方案1】:

    第一个问题,

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

    第二个问题

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

    第三个问题

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

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

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

    【讨论】:

    • 感谢您的快速回答。我的很多疑问现在都清楚了。但是在我的第一个问题中我没有使用属性,我直接使用了实例变量。所以在这种情况下它不会释放以前的实例对吧?
    • 是的,它不会。你是对的我没有注意到它,如果你想设置它自己的变量,那么你将不得不分配,这就是你没有收到泄漏的原因
    • 你能详细说明我得到了什么吗?
    • @Omar Abdelhafith 很好的答案,非常解释性
    • 感谢@OmarAbdelhafith 的详细回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-18
    • 2019-03-20
    相关资源
    最近更新 更多