【发布时间】:2011-06-28 06:38:11
【问题描述】:
是否可以释放类对象?
我有一个单例类“singleton.h”,它有一个实例,我们可以在任何其他视图控制器中使用它的属性。
+(singleton *)sharedMethod{
static singleton *myInstance=nil;
if(myInstance ==nil){
myInstance=[[singleton alloc] init]; myInstace.str=@"hello";
}
return myInstance;
}
我想知道的是..,有什么方法可以在我们的任何视图控制器中释放类对象...然后再次创建一个新的单例类的实例..,我试过这样做..,Xcode 抛出错误“无法释放类对象”。
【问题讨论】:
-
[[singleton sharedMethod] release];[singleton sharedMethod] = nil;然后[singleton sharedMethod]会给你一个新的实例。编辑:很公平,也许那行不通。但是无论如何,解除单例的整个概念都是错误的。永远不应该这样做。 -
@darvids0n:不,
[singleton sharedMethod] = nil;甚至无法编译,因为您试图将右值分配给右值。此外,在真正的单例实现中,通过使release成为 NOP 来防止释放。 -
可能是
*[singleton sharedMethod] = nil;?还是= NULL/= 0x0;? -
@darvids0n:不,仍然无法工作,即使它会编译(由于代码没有按照您的想法执行,所以稍后会出现警告和崩溃)。只有当您有一个方法可以返回您可以取消引用的 myInstance 变量的地址 时,它才会起作用。
-
根据单例的定义,不能用新的实例替换单例,满足成为单例的要求。您无法控制谁可能隐藏了对旧实例的引用,鉴于单例的定义,这应该是完全有效的事情。
标签: iphone objective-c xcode