我的应用中有一个单例对象:
+ (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];
我是否需要发布此对象?我在对象中有一个数组和其他东西需要释放。
答案 0 :(得分:6)
在Objective-C中,您应该只对您拥有的对象调用release
。这通常表示您使用alloc
,init
,copy
或mutableCopy
或以其他方式调用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];会工作的。