在iOS的Objective-C游戏中,我有一些对象作为单身人士。例如,World对象,记分板对象。
+ (World *)sharedWorld {
if (sharedWorld == nil) {
sharedWorld = [[World alloc] init];
}
return sharedWorld;
}
然而,我意识到如果用户退回到主菜单,然后点击“#34”新游戏"再次,它显然没有重新实例化,因为这些是单身人士。
我需要一种安全的方法来销毁这些(即将它们设置为nil),以便我可以干净地创建新实例。但是,即使只是在用户返回主菜单时将对象设置为nil的简单测试,下次他们实例化时我也会收到EXC_BAD_ACCESS错误。
答案 0 :(得分:2)
严格来说,单身人士永远不应该被摧毁(否则它就不会被称为单身人士!)。尝试使用不同的模式,例如使其成为单身对象的属性,如此
@interface App
@property (strong, nonatomic) World *world;
@end
并将其设置为nil
,当您要销毁它时。或者只是确保world
中的所有对象都引用了他们所居住的world
。
如果你真的需要诋毁一个单身人士(你有充分的理由,或者只是为了方便),那就试试吧
static World *g_world;
@implementation World
+ (instancetype)sharedInstance {
if (!g_world) {
g_world = [[World alloc] init];
}
return g_world;
}
+ (void)deallocateSharedInstance {
g_world = nil;
}
@end
答案 1 :(得分:2)
您必须创建一个类方法来重置Singleton对象。 我在我的项目中使用像
World *sharedInstance = nil;
+ (World *)sharedWorld {
if (sharedInstance == nil) {
sharedInstance = [[World alloc] init];
}
return sharedInstance;
}
// call this method when you want to reset shared object
+(void)reset
{
sharedInstance = nil;
}
答案 2 :(得分:0)
我想你需要挖掘更多并取消更多依赖的对象。 如果你在新项目上尝试简单的例子,那我就不会重现了。这是因为您当前的项目结构比简单案例复杂得多。我看到的Onl原因 - 使得更多依赖对象无效
答案 3 :(得分:0)
我认为你不应该完全释放你的单例实例(sharedWorld = nil),而应该释放资源驻留在单例(sharedWorld.resourceA = nil)中,因为你可以创建一个名为releaseResources
的函数并在此方法中将每个资源设置为nil。