我需要释放我的单例对象吗?

时间:2013-04-25 18:11:05

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

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

+ (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];

我是否需要发布此对象?我在对象中有一个数组和其他东西需要释放。

2 个答案:

答案 0 :(得分:6)

在Objective-C中,您应该只对您拥有的对象调用release。这通常表示您使用allocinitcopymutableCopy或以其他方式调用retain创建的对象。在这里,[DownloadFirstData shared]的消费者没有调用任何这些功能,也不负责释放它。例如,只要您拨打[UIColor blackColor],就会看到这一点。

如果您正在跨越自动释放边界或者只是不确定生命周期,您可能想要在这样的对象上调用retain

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

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

但是shared的定义呢?当您定义一个不使用init ...的方法时,您通常负责以[[self alloc] init] autorelease]之类的方式离开,其释放次数为0。对于单身人士来说情况并非如此,因为您的目标是始终存在,因此始终具有非零保留计数。只需在创建它之后不释放它就可以实现这一点。

答案 1 :(得分:1)

如果你要释放单身,那么没有任何意义。 通常会创建单例,因为您需要相同的对象,直到应用程序结束。 在应用程序生命周期结束时,将释放与应用程序相关的所有内存。

如果您经常需要分配版本,请使用标准方法。 如果你的单身人士占用了大量的内存,你应该考虑更好地写它。

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