2013-04-25 39 views
1

我有一个单独的对象在我的应用程序:我是否需要释放单身物件?

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

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

    } 
    return self; 
} 

而且我想知道如果我需要realese它(我没有使用ARC)。要做到这一点,我正在使用:

[[DownloadFirstData shared] release]; 

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

+0

如果它应该持续到应用程序结束,则不需要显式发布。虽然你可能想提供一个只是为了让分析仪开心。 – 2013-04-25 18:25:37

+0

为什么我不需要释放它?它有一个自动释放? – MTA 2013-04-25 18:26:26

+0

不,它没有autorelease(如果你还没有autorelease)。它会在应用程序结束时被杀死(就像所有对象仍在内存中一样),所以内存是免费的。 – 2013-04-25 18:32:27

回答

6

在Objective-C中,您只应对您拥有的对象调用release。这通常意味着您使用alloc,init,copymutableCopy或其他名为retain创建的对象。在这里,[DownloadFirstData shared]的用户没有调用任何这些功能,也不负责释放它。例如,您每次拨打[UIColor blackColor]时都会看到此内容。

您可能需要调用retain这样的对象,如果你正在穿越自动释放边界或者只是不知道寿命:

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

在这种情况下,你已经采取所有权,并负责释放。

但是shared的定义怎么样?当您定义不使用init ...的方法时,通常您需要负责将发布计数设置为0,例如[[self alloc] init] autorelease]。单身人士并不是这样,因为你的目标是永远存在,因此总是有一个非零的保留计数。您只需在创建后不发布它就可以实现这一点。

1

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

如果您经常需要alloc释放,请使用标准方法。 如果你的单身人士需要大量的记忆,你应该考虑写得更好。不管怎样,[[DownloadFirstData shared] release];将工作。

+0

发送'release'将会_work_,是的,但是从所有权POV来看是不正确的:单身对象拥有自己。真的,你的第一句话是正确的答案。 – 2013-04-25 18:30:58

+1

这应该创建一个编译器警告或静态分析器错误。名称“共享”并不意味着所有权的转移。 – 2013-04-25 18:32:16

+0

我刚才说过会有效果。不是说这样做是正确的。 :D – 2013-04-25 18:36:06

相关问题