基本保留、自动释放问题

Posted

技术标签:

【中文标题】基本保留、自动释放问题【英文标题】:Basic retain, autorelease question 【发布时间】:2011-01-19 16:04:00 【问题描述】:

保留和自动释放问题。

// A
UIView *temp = [[UIView alloc] init];
myView = temp;
[temp release];

// B
myView = [[UIView alloc] init];

这两个代码没有区别吗?

NSString *str = [NSString stringWithString:@"Hello"];
NSString *str = @"Hello";

这两个呢?我还不确定保留计数。谢谢。

【问题讨论】:

感谢 zoul 编辑我的文章 :) 【参考方案1】:

对于第一个示例,它们非常不同。在第一个代码块中,给 temp 的 UIView 的保留计数为 1(感谢 alloc)。当您在第三行释放它时,MyView 变量现在是错误的,因为该对象可能会被破坏。如果您希望 MyView 保留它,请执行以下操作:

MyView = [temp retain];

第一个示例的第二部分将创建一个全新的 UIView 实例,它与 temp 没有任何关系。

在第二个例子中,stringWithString 方法将autorelease 你的字符串,这意味着它会在“释放池”释放时自动为你释放,很久以后。您不必担心释放它。然而,在第二行中,字符串是静态分配的。它们完全不需要保留计数和释放。

忘了提...查看the answer to this question 了解有关保留/释放规则的更多信息。

【讨论】:

感谢 Tesserex 和其他人!【参考方案2】:

第一部分:不一样!

MyView 也将被释放,因为您只是在复制指针(保留计数 0)。 在第二个代码中,MyView 的保留计数为 1。


第二部分:基本一样。

【讨论】:

【参考方案3】:

    请记住,引用 MyView 只是指向 temp。因此,一旦您释放 temp,这也会影响 MyView。

    [NSString stringWithString:] 主要用于复制其他字符串,而不是引用内存地址。例如:

答:

NSString *string = someOtherString; // 复制对 someOtherString 的引用;

乙:

NSString *string = [NSString stringWithString: someOtherString]; // 复制另一个字符串。

【讨论】:

这不是真的,stringWithString 不会复制字符串,它会返回并自动释放字符串【参考方案4】:

一个有用的事情是,您可以 NSLog 保留计数,以便您可以自己进行测试。

但回到你的问题......

如果 MyView 是一个属性,并且您已经使用 self.MyView 引用了它并且它是使用保留或复制声明的,那么您的 2 个语句是相同的。如果 MyView 只是一个局部变量,你的 UIView 将在你这样做时释放

[temp release];

因为自从分配保留计数以来,您没有做任何事情来增加保留计数。

对于您的字符串示例...

[NSString stringWithString:@"Hello"];

返回一个自动释放的字符串。如果您需要将其保留很长时间,则需要对其进行保留。

第二个字符串示例是静态分配的字符串,您不必担心。保留计数不适用于它们。

【讨论】:

myView 没有使用点,因此,它是否是属性并不重要,因为直接赋值不会触发保留。 重新成为“有用的东西”——我强烈不建议跟踪实际保留计数。由于与代码中发生的事情(框架中的上游内容、添加和删除对象等)无关的原因,这些数字会经常更改,您将完全感到困惑和困惑。保留计数内存管理的全部意义在于您可以声明您的关注点,而不必担心框架的其他部分正在作用于相关对象。 用于诊断目的,效果很好。我并不是要在生产代码中发布它。但是对于测试这样的代码块,并查看保留计数如何递增和递减,它工作得非常好。 出于诊断目的,retainCount 很烂。唯一一次它“工作得很好”是在从不通过任何类型的系统 API 的对象中。同样,retain/autorelease 的一个实例,该数字毫无意义。总是有更好的工具来跟踪对象的生命周期和所有权。

以上是关于基本保留、自动释放问题的主要内容,如果未能解决你的问题,请参考以下文章

@property(保留)是不是自动释放或释放对象?

iPhone - 如果在自动释放后保留会发生啥?

在自动释放 ios 项目中保留变量

保留/自动释放已保留财产的额外好处是啥?

从自动释放对象上的保留转向引用是不是需要释放?

自动释放:必须[保留]成员变量?