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

MTA*_*MTA 1 singleton cocoa-touch memory-management objective-c

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

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

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

    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

我想知道我是否需要重新评估它(我不使用ARC).为此我正在使用:

[[DownloadFirstData shared] release];
Run Code Online (Sandbox Code Playgroud)

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

Bri*_*kel 6

在Objective-C中,您应该只调用release您拥有的对象.这通常意味着你已经有创建的对象alloc,init,copymutableCopy或以其他方式叫retain上.在这里,消费者[DownloadFirstData shared]没有调用任何这些功能,也不负责发布它.例如,你可以在任何时候看到这个[UIColor blackColor].

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

DownloadFirstData *local = [[DownloadFirstData shared] retain];
...
[local release];
Run Code Online (Sandbox Code Playgroud)

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

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