【问题标题】:Is release needed for a reference turned from retain on autorelease object?从自动释放对象上的保留转向引用是否需要释放?
【发布时间】:2011-12-09 17:01:16
【问题描述】:

对于以下代码,从 getFoo 返回的对象需要保留 1; 2 - 方法 func 中的 foo 是否需要释放?

- (NSString *)getFoo {
    return [[[NSString alloc] initWithString:@"foo"] autorelease];
}

- (void)func {
    // ??? is the retain needed?
    NSString *foo = [[self getFoo] retain];

    // use foo

    // ??? is the release needed?
    [foo release];
}

【问题讨论】:

    标签: objective-c release retain autorelease


    【解决方案1】:

    每个retain 必须与release 匹配。

    这就是说,在你的函数中,如果你不延迟它的使用,你不需要retain *foo。 通常自动释放池会在运行循环结束时获得drain,因此您有时间在函数中本地使用它。
    但是如果你retain你必须release

    你可以这样做:

    return [NSString stringWithString:@"foo];
    

    这是一个方便的方法,它返回一个autorelease 对象给你。

    【讨论】:

      【解决方案2】:

      如果你 alloccopyretain 一个对象,你需要 release 它。

      在您的示例中,您不需要保留它。但既然你这样做了,你确实需要释放它。

      【讨论】:

        【解决方案3】:

        您编写的代码很好。 当您分配字符串时,它的保留计数为 1。 然后您自动释放字符串,这将在以后减少保留计数。 你使用 foo. 那么你就不需要释放它了,因为你已经自动释放了它:它会在以后自动释放。

        请注意,您可以使用 stringWithFormat 或 stringWithString 创建一个已经自动释放的字符串。

        这样会更整洁一些。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-03-01
          • 2011-07-01
          • 2011-11-18
          • 2011-09-19
          • 2010-09-24
          • 2011-07-01
          • 2011-08-29
          • 1970-01-01
          相关资源
          最近更新 更多