【问题标题】:Retain/ Release count problem. Clarification needed [duplicate]保留/释放计数问题。需要澄清[重复]
【发布时间】:2011-08-20 17:08:28
【问题描述】:

可能重复:
check retain count

当我在玩retainrelease 计数时,我遇到了一种情况,我无法解释。请帮助我更好地理解它:

  • 有一个类O。它不包含变量,也不做任何事情。
  • 有一个类 Count。它初始化O 并为其增加、减少计数
  • 有一个带有 2 个按钮的 UI 笔尖:保留和释放

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
    o = [[O alloc]init]; // At this moment [o retainCount] is 1 as expected
    ....

对于每个 doRetain,按预期计算增量

- (IBAction)doRetain:(id)sender {
    [o retain];

    NSString *result = [[NSString alloc] initWithFormat:@"%d", [o retainCount]];    
    [label setText: result];  
    [result release];

}

每当调用释放时,计数就会减少

- (IBAction)doRelease:(id)sender {
    [o release];

    NSString *result = [[NSString alloc] initWithFormat:@"%d", [o retainCount]];
    [label setText: result];
   [result release];

}

考虑 1 个保留和 2 个释放

  1. 在分配初始化序列之后,我们从保留计数 1 开始
  2. 随后手动保留计数上升到 2
  3. 然后我们减少计数并将其降至 1
  4. 接下来的减少......似乎什么也没做保留计数仍然是 1
  5. 此版本涉及内存不足并导致应用程序崩溃。

请帮助我理解这种行为

【问题讨论】:

    标签: objective-c retaincount


    【解决方案1】:

    如果你的 retain count 为 1 并且你释放了,对象不再有效,releaseCount 属性没有意义(其结果是不可预测的)。

    另外,我知道这是一个测试,但是您使用 'alloc' 创建字符串,但从不释放它们。

    使用发布和保留时,您只需负责发布您自己的保留。其他对象可能会在相关对象上执行保留,然后它们会依次释放它们。

    如果您使用包含单词alloccopycreate 的方法获取对象,则该对象上隐含retain。否则,您可以假设该对象将在当前运行循环之后消失,因此如果您想挂在该对象的副本上,则需要执行保留。完成对象后,进行释放。

    【讨论】:

    • 这很有意义。谢谢道格
    【解决方案2】:

    实际上,保留计数是一种非常具有误导性的数据,是一种可怕的学习工具。您唯一可以指望保留计数是您期望的值的情况是:

    • 您将 NSObject 子类化(或创建自己的根类)

    • 不要将您的对象传递给任何系统API根本

    • 不要使用autorelease 永远

    一旦您违反了这些规则中的任何,保留计数将成为一个实现细节,其值超出您的控制范围。当然,在简单的情况下,它会相对一致。直到它不是,然后你就只能使用不准确的工具基于错误的假设来调试一些东西。

    不要调用retainCount!

    cocoa memory management guide 准确定义了应如何管理保留和释放。

    您应该将保留计数视为增量;操作将使其保持不变,或者增加或减少它。如果你导致它增加,你必须减少以放弃所有权。绝对值无关紧要。

    【讨论】:

      【解决方案3】:

      正如最近的另一篇文章所述,您永远不应该真正使用 [retainCount] 函数!

      check retain count

      【讨论】:

      • 好吧,那么......你如何跟踪你的保留计数?
      • 你没有。您首先正确地管理内存。
      • 我同意你永远不应该在你的应用程序中使用它们,但是它们对于理解事情是如何工作的很有用。而且,@mac - 您永远不会使用保留计数来确定是否释放实例。我会详细说明我的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      • 1970-01-01
      • 2011-12-28
      • 2012-07-05
      • 2011-11-17
      • 2011-08-23
      • 1970-01-01
      相关资源
      最近更新 更多