【问题标题】:Should I release this NSString?我应该释放这个 NSString 吗?
【发布时间】:2011-04-27 07:50:46
【问题描述】:

伙计们: 请帮忙。我有一个实用程序类来返回带有编码的 NSString。像这样:

/*Get a NSString with chinese encoding*/
+(NSString*) getGBKString:(void *)buffer
{
  NSString* string = [[[NSString alloc] 
                      initWithBytes:buffer 
                        length:sizeof(buffer) 
                        encoding:kCFStringEncodingGB_18030_2000] 
                      autorelease];

  return string;
}

autorelease 是正确的做法吗?

如果是这样,方法调用者应该调用retain以防NSString对象被释放?

【问题讨论】:

    标签: objective-c cocoa


    【解决方案1】:

    autorelease 是正确的做法吗?

    是的。由于该方法不包含+alloc/new/copy,因此要遵循Cocoa memory management rules,您应该返回一个没有所有权的对象。

    或者,您可以将方法重命名为+newGBKString: 并删除-autorelease,这样知道约定的人就会知道调用者将获得所有权。

    如果是这样,方法调用者应该调用 retain 以防 NSString 对象被释放?

    如果调用者想要保留 NSString,则应该-retain

    【讨论】:

    • 首先感谢 Kenny 和 Jacob。但我有点困惑。如您所说, -autorelease 会将保留计数更改为 0,那么 NSString 实例应该在返回之前被释放,对吗?那么调用者会得到一个 nil 吗?
    • 只有在自动释放池耗尽后,保留计数才会降至 0。
    • @icespace: -autorelease 基本上是“稍后发布”。当您调用-autorelease 时,所有权将转移到一个自动释放池中,当运行循环滴答作响时,该池将-release 它。效果就像返回一个保留计数为 0 的“垂死”对象(但仍然有效)。
    • @Kenny:自动释放池在 iOS 中是如何工作的?我认为有一个与该方法相关的隐式自动释放池。既然方法是静态方法,那么自动释放池会在方法出栈后释放方法作用域变量吗?
    猜你喜欢
    • 1970-01-01
    • 2010-12-03
    • 2011-05-26
    • 2011-07-04
    • 2023-03-03
    • 1970-01-01
    • 2011-03-21
    • 2017-04-01
    • 1970-01-01
    相关资源
    最近更新 更多