NSMutableDictionary EXC_BAD_ACCESS

时间:2011-09-15 02:52:32

标签: iphone ios singleton nsmutabledictionary

我知道有很多关于这个话题的问题,但是对我来说没有问题,因为我有点奇怪。

首先,我创建一个静态单例类。并声明NSMutableDictionary的变量

static NSMutableDictionary* mydic
@implementation mySingleton

-(mySingleton*)getInstance
{
    static mySingleton *sharedInstance;
    @synchronized(self)
    {
       if(!sharedInstance)
       {
          sharedInstance = [[mySingleton alloc] init];
          mydic = [[NSMutableDictionary alloc] initWithCapacity:1];
       }
       return sharedInstance;
    }
}

-(NSMutableDictionary*)getDictionary
{
   return myDic;
}

然后我从另一个类中调用这个NSMutableDictionary,如下所示。

NSMutableDictionary* singletonDictionary = [[mySingleton getInstance] getDictionary];

MyOtherClass* myclass = [singletonDictionary objectForKey:key];// Key is NSString
// Here I can see whole the values I added to myClass for that key
NSArray *checkKey = [singletonDictionary allKeys];
for(int i = 0; i < [singletonDictionary count]; i++)
{
    NSLog(@"%@",[checkKey objectAtIndex:i]);// here I can see my key is there
}

[singletonDictionary removeObjectForKey:key];// here it crashes EXC_BAD_ACCESS

我会对这个问题感到疯狂。如果有人有想法,请与我分享。

编辑:

MyOtherClass * myinstance = [[MyOtherClass alloc] init];
// Fill up the instance with the desired variable here
// Forexample
// myinstance.name = [NSString stringWithFormat:@"myInstanceName"];
.
.
.

[[[mySingleton getInstance] getDictionary] setObject:myinstance forKey:key]// key is an NSString*
[myinstance release];

感谢您的帮助。

Omer Faruk KURT

2 个答案:

答案 0 :(得分:3)

这么多问题,从哪里开始......?

至少,您的getInstance方法似乎没有返回任何内容;它可能应该返回mySingleton。这可以解释您的EXEC_BAD_ACCESS,因为singletonDictionary可能是nil

您的单例实例化也是错误的 - 您需要检查单例是否已经创建,如果有,则返回它。否则你可以重新分配单身,这是荒谬的。

这里的静态引用设计很差,最好在头文件中子类化并声明成员。

这可能会解决你的问题,但你显然是在深陷,你会遇到更多的麻烦。我认为你需要在文本或在线中找到很好的代码示例并研究它们。如果你很快就会这样做,你就会学习绳索。

答案 1 :(得分:0)

NSMutableDictionary保留添加到字典中的对象。当移除对象时,它们被释放。因此,从字典中删除对象将访问该对象。如果您之前已释放该对象并且已取消分配,则可能会引发异常。如果在从字典中删除之前检查对象的状态,您可能会发现它已经被释放并被释放。