Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSMutableDictionary EXC\u访问错误_Iphone_Ios_Singleton_Nsmutabledictionary - Fatal编程技术网

Iphone NSMutableDictionary EXC\u访问错误

Iphone NSMutableDictionary EXC\u访问错误,iphone,ios,singleton,nsmutabledictionary,Iphone,Ios,Singleton,Nsmutabledictionary,我知道关于这个话题有很多问题,但没有一个对我有用,因为我的问题有点奇怪 首先,我创建了一个静态单例类。并声明NSMutableDictionary的一个变量 static NSMutableDictionary* mydic @implementation mySingleton -(mySingleton*)getInstance { static mySingleton *sharedInstance; @synchronized(self) { if

我知道关于这个话题有很多问题,但没有一个对我有用,因为我的问题有点奇怪

首先,我创建了一个静态单例类。并声明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
谢谢你的帮助


奥马尔·法鲁克·库尔特(Omer Faruk KURT)

这么多问题,从哪里开始

至少,您的
getInstance
方法似乎没有返回任何内容;它可能会返回
mySingleton
。这可以解释您的
EXEC\u BAD\u访问
,因为
singletonDictionary
可能是
nil

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

静态引用在这里设计得很糟糕,最好在头文件中对成员进行子类化和声明


这可能会解决你的问题,但你显然是在做深层次的事,你会遇到更多的麻烦。我认为你需要在文本或在线上找到好的代码示例,并加以研究。如果你很快做到这一点,你就会学会诀窍。

这么多问题,从哪里开始

至少,您的
getInstance
方法似乎没有返回任何内容;它可能会返回
mySingleton
。这可以解释您的
EXEC\u BAD\u访问
,因为
singletonDictionary
可能是
nil

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

静态引用在这里设计得很糟糕,最好在头文件中对成员进行子类化和声明


这可能会解决你的问题,但你显然是在做深层次的事,你会遇到更多的麻烦。我认为你需要在文本或在线上找到好的代码示例,并加以研究。如果您很快这样做,您将学会诀窍。

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

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

很抱歉,我正在使用另一台计算机来实现,我只是毫不在意地编写上述代码。所以我没有检查。实际上,我返回实例并检查它之前是否已分配。这不是问题,我想我会再次为您编辑它。对不起,我问这个问题太急了,所以我犯了一些错误。:)对不起,我正在使用另一台计算机来实现,我只是毫不在意地编写上面的代码。所以我没有检查。实际上,我返回实例并检查它之前是否已分配。这不是问题,我想我会再次为您编辑它。对不起,我问这个问题太急了,所以我犯了一些错误。:)所以在这个场景中,如果我用objectForKey获取对象,然后释放对象,实际上字典中的对象将被释放?那么,在释放包含的对象之前和之后,字典对象的计数是否可以接受?编辑:我没有释放从字典中获取的任何对象。objectForKey返回字典中的相同对象。按照规则,除非在获取指针后保留对象,否则不会向该对象发送释放。如果在字典中释放对象,则不会影响字典中的项目计数;但是,如果该版本与retain不匹配,那么当字典试图删除该对象时,您将得到一个异常。我释放对象的唯一位置是添加到字典后的对象。我的意思是在我设置了一个对象:object forKey:key之后,我释放了[object release]。这是我唯一释放对象的地方。我调用objectForKey:并在它移除objectForKey:之后立即调用它。我的意思是在下一行,objectForKey:没有问题,移除objectForKey:使其崩溃。我觉得这很奇怪。仅供参考,我在一个静态库上编写了这段代码,我正在另一个项目中使用它。这会影响撞车吗?我对这次崩溃非常绝望…我不确定静态库的东西。实验的一个想法是在将对象添加到字典后注释掉您的版本。我知道如果你alloc/init它是你要释放的对象,但是这可以帮助测试它是否是一个引用计数问题。所以在这个场景中,如果我用objectForKey获取对象,然后释放该对象,实际上字典中的对象将被释放?那么,在释放包含的对象之前和之后,字典对象的计数是否可以接受?编辑:我没有释放从字典中获取的任何对象。objectForKey返回字典中的相同对象。按照规则,除非在获取指针后保留对象,否则不会向该对象发送释放。如果在字典中释放对象,则不会影响字典中的项目计数;但是,如果该版本与保留不匹配,则您将
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];