1

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

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

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

4

2 回答 2

6

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

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

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

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

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

于 2013-04-25T18:48:40.323 回答
1

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

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

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

于 2013-04-25T18:26:31.633 回答