2011-09-15 35 views
0

我知道关于这个话题有很多问题,但他们中没有一个对我有用,因为我有点奇怪。NSMutableDictionary EXC_BAD_ACCESS

首先我创建一个静态单例类。和声明的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

+0

你是否也请将你的代码添加到字典中的对象? – xuzhe

回答

3

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

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

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

静态引用在这里是糟糕的设计,最好在头文件中继承和声明成员。

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

+0

对不起,但我正在使用另一台计算机来实现,我只是写无上述代码。所以我没有检查它。实际上,我返回实例并检查它是否在之前分配。那不是我想再次编辑它的问题。对不起,我太紧急问这个问题,所以我犯了一些错误。 :) –

0

NSMutableDictionary保留添加到字典中的对象。当对象被移除时,它们被释放。结果,从字典中删除一个对象访问该对象。如果您以前释放了该对象并将其解除分配,那么这可能会导致引发异常。如果您在从字典中移除对象之前检查对象的状态,您很可能会看到它已经被释放和处理。

+0

因此,在这个scenerio中,如果我用objectForKey获取对象然后释放对象,实际上字典中的对象将被释放?那么在释放它所包含的对象并在那之后获得相同数量的字典对象是否可以接受?编辑:我没有发布我从字典中得到的任何对象。 –

+0

objectForKey返回字典中的相同对象。按照规则,除非在获取指针后保留该对象,否则不会将释放发送给该对象。如果您在字典中释放对象,则不会影响字典中项目的数量;但是,如果该版本与保留不匹配,那么当字典尝试删除该对象时,您最终会遇到异常。 –

+0

我一遍又一遍检查代码。我发布一个对象的唯一地方就是我添加到字典后的对象。我的意思是在setAnObject:object forKey:key之后,我释放[object release]。那是我释放对象的唯一地方。我调用objectForKey:并在它之后removeObjectForKey:。我的意思是在下面一行和objectForkey:没有问题,removeObjectForKey:使它崩溃。这对我来说似乎很奇怪。仅供参考我在静态库上编写了这段代码,我在另一个项目中使用它。这可能会导致崩溃吗?我对这次崩溃感到绝望...... –