我正在尝试实现一个单例,它充当了一个存根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?
上的最后一个条目答案 0 :(得分:3)
看起来您的单身人士已被解除分配,而另一个实例则取消了其地址。
您应该检查您的代码以了解这是如何实现的。 (你永远不应该保留/释放那个单身人士)
这就是为什么我强烈建议您使用Matt Gallagher的cocoawithlove singleton macro download there,这是非常容易和简洁的使用:
SYNTHESIZE_SINGLETON_FOR_CLASS(MyClassName);
这是一个 完美的单例实现 ,可以通过释放意外您的单身来避免此类问题,这看起来像是您的问题。它基于Apple recommandations,它会覆盖release,retainCount等,以保护您的单身人士。