gpt4 book ai didi

iphone - Objective C 中的 Singleton 问题

转载 作者:行者123 更新时间:2023-12-03 20:54:41 27 4
gpt4 key购买 nike

我正在尝试实现一个单例,它充当 stub 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]:无法识别的选择器发送到实例 0xa7072202011-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?上的最后一个条目。

最佳答案

看起来您的单例已被释放,并且另一个实例占用了它的地址。

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

这就是为什么我强烈建议使用 Matt Gallagher 的 cocoawithlove singleton macro你可以download there ,使用起来非常简单和简洁:

SYNTHESIZE_SINGLETON_FOR_CLASS(MyClassName);

这是一个完美的单例实现,通过意外地解除分配您的单例来避免此类问题,这看起来是您的问题。它基于Apple recommandations ,它会覆盖release、retainCount等来保护你的单例。

关于iphone - Objective C 中的 Singleton 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5825828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com