是否可以释放一个类对象?
我有一个单例类“singleton.h”,它有一个实例,我们可以在任何其他视图控制器中使用它的属性。
+(singleton *)sharedMethod{
static singleton *myInstance=nil;
if(myInstance ==nil){
myInstance=[[singleton alloc] init]; myInstace.str=@"hello";
}
return myInstance;
}
我想知道的是..,有没有什么方法可以在我们的任何viewControllers中释放类对象...然后再次创建一个新的单例类的实例..,我试过这样做..,Xcode抛出一个错误“不能dealloc类对象”。
答案 0 :(得分:8)
单身人士的全部意义在于你永远不会解除分配。其他类可以保护指向实例的指针,因此如果你想要替换它,你会得到奇怪的行为,甚至有时会崩溃。所以你不应该这样做。
但只要您没有覆盖release
和retainCount
方法,就有可能。但是你引用的错误信息似乎表明你已经做了[MyClass release];
这样的事情,当然这不起作用。
singleton
作为班级名称。请尽量遵守Apple使用的编码惯例,以使您和其他人的生活更轻松。类名应始终以大写字符开头,方法名应始终以小写字符开头。
答案 1 :(得分:2)
声明
static YOUR_CLASS *shared = nil;
static dispatch_once_t oncePredicate; //very important for reinitialize.
使用实例
+ (instancetype)shared {
dispatch_once(&oncePredicate, ^{
shared = [[self alloc] init];
});
return shared;
}
复位
+ (void)reset{
@synchronized(self) {
shared = nil;
oncePredicate = 0;
}
}
你很高兴去√
答案 2 :(得分:0)
如果你不解除 singleton 类的释放,这是非常可观的,因为在完全执行你的应用程序之前不会这样做。有关更多信息,请参阅this。要重新初始化 singleton 类,您需要像第一次那样做。
答案 3 :(得分:-1)
这个解决方案帮助了我。创建一个单独的方法来初始化类。
@implementation SomeManager
static id sharedManager = nil;
+ (void)initialize {
if (self == [SomeManager class]) {
sharedManager = [[self alloc] init];
}
}
+ (id)sharedManager {
return sharedManager;
}
@end