【问题标题】:Do I need to release my singleton object?我需要释放我的单例对象吗?
【发布时间】:2013-04-25 18:11:05
【问题描述】:

我的应用中有一个单例对象:

+ (id)shared {
    @synchronized(self) {
        if (sharedDownloadFirstData == nil)
            sharedDownloadFirstData = [[self alloc] init];
    }
    return sharedDownloadFirstData;
}

- (id) init {
    if (self = [super init]) {

    }
    return self;
}

我想知道我是否需要重新编译它(我没有使用 ARC)。为此,我正在使用:

[[DownloadFirstData shared] release];

我需要释放这个对象吗?我需要释放的对象中有一个数组和其他东西。

【问题讨论】:

  • 如果它应该持续到应用程序结束,则不需要显式发布。虽然您可能想提供一个只是为了让分析器满意。
  • 为什么我不需要发布它?它有一个自动释放?
  • 不,它没有自动释放(如果你没有放自动释放)。当应用程序结束时它会被杀死(就像所有仍在内存中的对象一样),因此内存是空闲的。
  • 您不必发布它,因为它将在应用程序的整个生命周期内都存在。你也不应该保留。
  • @BrianNickel:来自客户端代码的retaining 可能是正确的,因为该代码不应该知道或不需要考虑对象是否是单例和/或管理自己的生命周期。它应该遵循内存管理规则,即shared 返回一个引用,如果不保留该引用可能随时消失。在这种情况下,当然,每个retain 必须与release 平衡。

标签: objective-c cocoa-touch memory-management singleton


【解决方案1】:

在 Objective-C 中,您应该只在您拥有的对象上调用 release。这通常意味着您使用allocinitcopymutableCopy 或以其他方式调用retain 创建的对象。在这里,[DownloadFirstData shared] 的使用者没有调用任何这些函数,也不负责释放它。例如,您在任何时候拨打[UIColor blackColor] 时都会看到这一点。

如果您正在跨越自动释放边界或者只是不确定生命周期,您可能希望在此类对象上调用 retain

DownloadFirstData *local = [[DownloadFirstData shared] retain];
...
[local release];

在这种情况下,您已取得所有权并负责发布。

但是shared 的定义呢?当您定义一个不使用 init... 的方法时,您通常负责以 0 的发布计数离开,类似于 [[self alloc] init] autorelease]。单例不是这种情况,因为您的目标是让它始终存在,因此始终具有非零保留计数。您只需在创建后不释放它即可实现这一点。

【讨论】:

    【解决方案2】:

    如果你要释放它,那么拥有一个单例是没有意义的。 通常会创建一个单例,因为您想要相同的对象直到应用程序结束。 在应用生命周期结束时,与应用相关的所有内存都会被释放。

    如果您经常需要分配释放,请使用标准方法。 如果你的单例占用大量内存,你应该考虑写得更好。

    无论如何,[[DownloadFirstData shared] release];会工作的。

    【讨论】:

    • 发送release工作,是的,但从所有权 POV 来看是不正确的:单例对象拥有自己。真的,你的第一句话就是正确答案。
    • 这应该会产生编译器警告或静态分析器错误。 “共享”的名称并不意味着所有权的转移。
    • 我只是说这行得通。并不是说这样做是正确的。 :D
    • 下次他尝试引用已处理的单例时,应用程序也可能崩溃。
    猜你喜欢
    • 2012-01-22
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2011-03-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    相关资源
    最近更新 更多