我对如何有效使用singleton感到困惑。我希望我的singleton类表现得像[NSUserDefaults standardUserDefaults]。但是我观察到的是每次创建新对象时,每次都看到一个不同的内存地址。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

MyManager *sharedManager = [MyManager sharedManager];

if(sharedManager.name.length==0) {
sharedManager.name = @"manager";
    }


return YES;
}



+ (id)sharedManager {
    static MyManager *sharedMyManager = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedMyManager = [[self alloc] init];
    });
    return sharedMyManager;}


每次启动时,if子句都会执行。

最佳答案

您要实现的不是singleton要做的。

singleton是一个对象,在您的应用程序运行时,该实例只有一个实例。如果您连续拨打10次[MyManager sharedManager],则每次都会获得相同的地址。

退出应用程序后,就像其他任何对象一样,singleton被销毁。下次启动该应用程序时,将创建一个没有任何旧数据的全新singleton

NSUserDefaults甚至可以在退出并重新启动应用程序后记住数据,因为persisting就是将数据保存到磁盘上(即,在某个位置写入文件。)如果您希望具有类似的行为,则还需要保存数据到文件,并在启动时读取该文件。

07-24 15:50