安全地破坏和重建单身人士

时间:2014-11-26 05:49:17

标签: ios objective-c

在iOS的Objective-C游戏中,我有一些对象作为单身人士。例如,World对象,记分板对象。

+ (World *)sharedWorld {
    if (sharedWorld == nil) {
        sharedWorld = [[World alloc] init];
    }
    return sharedWorld;
}

然而,我意识到如果用户退回到主菜单,然后点击“#34”新游戏"再次,它显然没有重新实例化,因为这些是单身人士。

我需要一种安全的方法来销毁这些(即将它们设置为nil),以便我可以干净地创建新实例。但是,即使只是在用户返回主菜单时将对象设置为nil的简单测试,下次他们实例化时我也会收到EXC_BAD_ACCESS错误。

4 个答案:

答案 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。