目标C中Singleton的问题

时间:2011-04-28 22:36:14

标签: iphone objective-c singleton

我正在尝试实现一个单例,它充当了一个存根DAO,我需要应用程序的不同区域才能读取和写入它。使用它的第一个类可以使用我的sharedSingleton类级构造函数完成此任务,但是当我尝试以完全相同的方式从另一个类访问它时,我得到一个EXC_BAD_ACCESS错误和方法的第一行中的调试行我呼吁单身人士永远不会被击中。

+(DAOController *) sharedSingleton
{    
    static DAOController *sharedSingleton;

    @synchronized(self)
    {
        if (!sharedSingleton)
            sharedSingleton = [[DAOController alloc] init];

        return sharedSingleton;
    }
}

    -(id) init
{
    if (self = [super init])
    {
        [self initDictionary];
    }
    return self;
}

我在viewDidLoad

中两次完全相同的调用
    DAOController *daoController = [DAOController sharedSingleton];
self.teams = [daoController getTeamsForPlayer];

但是在第二次它会抛出异常或EXC_BAD_ACCESS

2011-04-28 18:31:22.403 IScore [5637:207] - [NSKeyValueIvarSetter getTeamsForPlayer]:无法识别的选择器发送到实例0xa707220 2011-04-28 18:31:22.435 IScore [5637:207] *由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [NSKeyValueIvarSetter getTeamsForPlayer]:无法识别的选择器发送到实例0xa707220' 首次调用堆栈:

该方法只是

   -(NSMutableArray*) getTeamsForPlayer
{
    NSMutableArray *teamsForPlayer = [[[NSMutableArray alloc] init] autorelease];
    Team *team1 = [self.teams objectForKey:[NSNumber numberWithInt:1]];
    [teamsForPlayer addObject:team1];
    [team1 release];
    return teamsForPlayer;
}

如果我将第二个实例更改为非共享,我可以运行没有问题的方法

    DAOController *daoController = [[DAOController alloc]init];

任何帮助将不胜感激。单身模式取自What should my Objective-C singleton look like?

上的最后一个条目

1 个答案:

答案 0 :(得分:3)

看起来您的单身人士已被解除分配,而另一个实例则取消了其地址。

您应该检查您的代码以了解这是如何实现的。 (你永远不应该保留/释放那个单身人士)

这就是为什么我强烈建议您使用Matt Gallagher的cocoawithlove singleton macro download there,这是非常容易和简洁的使用:

SYNTHESIZE_SINGLETON_FOR_CLASS(MyClassName);

这是一个 完美的单例实现 ,可以通过释放意外您的单身来避免此类问题,这看起来像是您的问题。它基于Apple recommandations,它会覆盖release,retainCount等,以保护您的单身人士。