【问题标题】: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 编辑我的文章 :)

标签: iphone objective-c ios retain autorelease


【解决方案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】:
    1. 请记住,引用 MyView 只是指向 temp。因此,一旦您释放 temp,这也会影响 MyView。

    2. [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 的一个实例,该数字毫无意义。总是有更好的工具来跟踪对象的生命周期和所有权。
    猜你喜欢
    • 2011-11-17
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多