基本保留、自动释放问题
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
的一个实例,该数字毫无意义。总是有更好的工具来跟踪对象的生命周期和所有权。以上是关于基本保留、自动释放问题的主要内容,如果未能解决你的问题,请参考以下文章