NSMutableArray 和 NSDictionary 错误

Posted

技术标签:

【中文标题】NSMutableArray 和 NSDictionary 错误【英文标题】:NSMutableArray and NSDictionary Error 【发布时间】:2011-08-26 08:22:48 【问题描述】:

我有一个名为 SubList 的 NSMutableArray,它包含 262 个元素。每个对象都是一个 NSDictionary!

这段代码就像一个魅力!

for (NSDictionary *element in listSub)
    [cell.textLabel setText:[element objectForKey:@"title"]];  

  

但是,如果我尝试使用此代码,则会收到 SIGBART 错误!

NSDictionary * element = [listSub objectAtIndex:[indexPath row]];

[cell.textLabel setText:[element objectForKey:@"title"]];

那么问题出在哪里?

*编辑问题出在这一行

NSDictionary * element = [listSub objectAtIndex:[indexPath row]];

这是描述 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFSet objectAtIndex:]:无法识别的选择器发送到实例 0x89a8d90” 谢谢

**编辑 这是 listSub 的输出!

listSub: (
        
        categories =         (
                        
                id = "user/14761688561595773457/label/Web Programming";
                label = "Web Programming";
            
        );
        firstitemmsec = 1265885595862;
        id = "feed/http://feeds.feedburner.com/FamousBloggers";
        sortid = A11327DE;
        title = "Famous Bloggers";
    ,
        
        categories =         (
                        
                id = "user/14761688561595773457/label/Hacking";
                label = Hacking;
            
        );
        firstitemmsec = 1241258413829;
        htmlUrl = "http://backtrack-italia.blogspot.com/";
        id = "feed/http://feeds2.feedburner.com/BackTrackItalia";
        sortid = E8A04F76;
        title = "Back Track Italia";
    ,
        
        categories =         (
                        
                id = "user/14761688561595773457/label/Hacking";
                label = Hacking;
            
        );
        firstitemmsec = 1245376992188;
        htmlUrl = "http://www.offensive-security.com";
        id = "feed/http://www.offensive-security.com/blog/feed/";
        sortid = 92F57555;
        title = "BackTrack Information Security Distribution";
    ,
        
        categories =         (
                        
                id = "user/14761688561595773457/label/ios Developer";
                label = "iOS Developer";
            
        );
        firstitemmsec = 1296830392306;
        htmlUrl = "http://amix.dk/Main/";
        id = "feed/http://feeds.feedburner.com/amixdk";
        sortid = 110C52C3;
        title = "amix.dk blog";
    ,
        
        categories =         (
                        
                id = "user/14761688561595773457/label/Apple News";
                label = "Apple News";
            
        );
        firstitemmsec = 1285261350202;
        htmlUrl = "http://www.appletvhacks.net";
        id = "feed/http://www.appletvhacks.net/feed/";
        sortid = 81125D2E;
        title = "Apple TV Hacks";
    ,
        
        categories =         (
                        
                id = "user/14761688561595773457/label/Apple News";
                label = "Apple News";
            
        );
        firstitemmsec = 1293230300220;
        htmlUrl = "http://www.appletvitalia.it";
        id = "feed/http://www.appletvitalia.it/feed/";
        sortid = 892FE61C;
        title = "Apple Tv Italia";
    ,
        
        categories =         (
                        
                id = "user/14761688561595773457/label/Apple News";
                label = "Apple News";
            
        );
        firstitemmsec = 1270115980935;
        htmlUrl = "http://www.appleecious.com";
        id = "feed/http://feeds2.feedburner.com/appleecious";
        sortid = 00B5AFC2;
        title = Appleecious;
    ,
        
        categories =         (
                        
                id = "user/14761688561595773457/label/Hacking";
                label = Hacking;
            
        );
        firstitemmsec = 1258495136927;
        htmlUrl = "http://www.rawseo.com/news";
        id = "feed/http://www.rawseo.com/news/feed/";
        sortid = D6766911;
        title = "A blend of programming and seo";
    ,
        
        categories =         (
                        
                id = "user/14761688561595773457/label/Seo e Web Marketing";
                label = "Seo e Web Marketing";
            
        );
        firstitemmsec = 1233684720758;
        htmlUrl = "http://it-adsense.blogspot.com/";
        id = "feed/http://it-adsense.blogspot.com/atom.xml";
        sortid = 9FB570ED;
        title = "AdSense Blog-Italiano";
    ,
        
        categories =         (
        );
        firstitemmsec = 1277627346000;
        htmlUrl = "http://aext.net";
        id = "feed/http://feeds.feedburner.com/aextnet";
        sortid = 70800CFE;
        title = "AEXT.NET NET MAGAZINE";
    ,
        
        categories =         (
        );
        firstitemmsec = 1217001547735;
        htmlUrl = "http://www.alessandroscoscia.it";
        id = "feed/http://feeds.feedburner.com/alessandroscoscia";
        sortid = 51CB8E6E;
        title = "Alessandro Scoscia";
    ,
        
        categories =         (
                        
                id = "user/14761688561595773457/label/iOS Developer";
                label = "iOS Developer";
            
        );
...

我确定它不是 NSSet。

现在我发布用于填充数组的代码。

 NSError *error;
    NSURLResponse *response;
    NSData  *dataReply = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:&response error:&error];
    NSString *string = [[NSString alloc] initWithData:dataReply encoding:NSASCIIStringEncoding];
    NSLog(@"testing %@",string);


    SBJsonParser *vol= [[SBJsonParser alloc]init];
    if (string) 
        NSArray *feeds = [vol objectWithString:string error:nil];
        NSDictionary *results = [string JSONValue];
        NSArray *subs = [results valueForKey:@"subscriptions"];

        for (NSDictionary *iscrizione in subs)

            [subscriptions addObject:iscrizione];

        

这是另一个类的一部分,如果我尝试做这样的事情,也在我的代码的这一部分中: NSDictionary * element = [listSub objectAtIndex:0]; NSLog([元素 objectForKey:@"title"]);

如果我尝试这样的循环,我会得到同样的错误

for (NSDictionary *element in listSub)
    [cell.textLabel setText:[element objectForKey:@"title"]];  

 

一切正常,没有 NSSet 错误。这让我抓狂!

【问题讨论】:

能否也粘贴错误信息... 什么是大声笑,你正在调用 [lol objectForKey:@"title"] 并得到正确的结果,同时在元素中有字典? 你在[element objectForKey:@"title"]中有%吗? 检查更新的 one.call [listSub retain] 访问数据的位置。 我在 NSDictionary * element = [listSub objectAtIndex:[indexPath row]] 之前添加了 [listSub retain];但不起作用:( 【参考方案1】:

问题可能是listSub 没有正确保留,因此已经发布。内存现在被重新使用,该地址的对象现在是__NSCFSet,它不响应objectAtIndex:

请注意,由[NSMutableArray arrayWithXXX] 之类的便利类方法返回的自动释放对象应保留,仅在不再需要时才释放。确保它们被保留的最佳方法是声明@property(retain) NSArray *subList@synthesize 并在所有情况下使用self.subList,可能在dealloc 中除外。

加法

建议创建subList 的方法返回一个集合而不是数组。如果是这样的话,答案开头的简单循环也不会起作用。这就是为什么我发现 subList 最初不太可能是 NSSet,更有可能是数组被过度释放和释放,并且内存重新用于 NSSet

请按照希望帮助您的人的要求去做

添加行

NSLog(@"listSub: %@", listSub);

在设置 listSub 的地方,也就是在错误行之前。然后在错误日志中查看它显示的内容并告诉我们。

【讨论】:

或者他用来获取 listSub 的任何方法实际上都返回了一个集合。 如何查看方法是否返回集合? 也许看看方法的来源?还是设置好后NSLog(@"listSub = %@", [listSub description]); @JeremyP:但是问题开头的简单循环也不应该起作用。这就是让我认为它已经被释放的原因。这不是返回集合而不是数组 AFAICS 的常规代码。 查看我上面的评论——for(... in ...) 构造适用于任何“集合”。【参考方案2】:

你试过了吗:

[cell.textLabel setText:[element objectForKey:@"title"]];  

那个“笑”是什么??

【讨论】:

对不起,我弄错了剪切和粘贴...我编辑了我的代码。错误在这一行 NSDictionary * element = [listSub objectAtIndex:[indexPath row]];【参考方案3】:

listSub 不是数组,而是NSSet

【讨论】:

要么产生listSub 的接口返回NSSet,要么(可能不太可能)如Rudy 建议的那样,listSub 没有正确保留,NSSet 已在以前由 NSArray 占用的存储空间。反过来,这意味着您是时候卷起袖子做一些实际的调试了,而不是要求一个固定的解决方案。 @Daniel:如果一个方法“意外”返回了一个集合而不是一个数组,那么他问题开头的简单循环也会失败。在那里, subList 显然是一个有效的数组。所以这个数组一定已经丢失并被一个集合替换。我怀疑他会在他的代码中这样做,所以我认为我的情况仍然是最有可能的。 不,循环很好。 “NSSet 中的元素”和“NSArray 中的元素”一样有效。 NSSet 本质上是一个无序的 NSArray(如果没有顺序,objectAtIndex 毫无意义)。 循环没问题,结果不行。 结果有什么问题? (顺便说一句,OP 没有向我们展示结果。)【参考方案4】:

问题来了

[cell.textLabel setText:[NSString stringWithFormat:[element objectForKey:@"title"]]];

当您调用 stringWithFormat 时,您需要像这样以字符串文字形式给出格式

[cell.textLabel setText:[NSString stringWithFormat:@"%@",[element objectForKey:@"title"]]];

或直接设置文本而不调用stringWithFormat:

你的数组在某个地方被释放了,所以为了解决这个问题,你需要在你的数组上的正确位置调用retain。

【讨论】:

虽然是正确的解释,但真正的答案是他已经有字符串时不需要使用stringWithFormat: 是的,我编辑了我的代码,错误不在该行!看看吧! @Abizern Ya 但是如果他有任何不是 NSString 类对象的对象并在没有声明格式的情况下调用 stringWithFormat ,那么就会发生这种情况。所以可能这里的对象不是 NSString。 【参考方案5】:

试试这个。

NSDictionary * element = [listSub objectAtIndex:[indexPath row]];
[cell.textLabel setText:[NSString stringWithFormat:@"%@",[element objectForKey:@"title"]]];

或在您编辑问题时尝试此操作,编辑

NSDictionary *element = [[NSDictionary alloc] initWithDictionary:[listSub objectAtIndex:indexPath.row]];
[cell.textLabel setText:[element objectForKey:@"title"]];
[element release];

【讨论】:

再次得到同样的错误。 *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[__NSCFSet objectAtIndex:]:无法识别的选择器发送到实例 0x7ea8f30” 它告诉你 objectAtIndex 选择器正在用于 NSSet,而不是 NSArray。

以上是关于NSMutableArray 和 NSDictionary 错误的主要内容,如果未能解决你的问题,请参考以下文章

NSMutableArray和NSArray的相互转换

NSMutableArray,removeFromArray 和 release,为啥会崩溃?

NSMutableArray 与 init 和 mutableCopy,如何自动释放?

NSMutableArray 和 NSDictionary 错误

这种创建和填充 NSMutableArray 的尝试有啥问题?

NSMutableArray 和属性泄漏内存