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,removeFromArray 和 release,为啥会崩溃?
NSMutableArray 与 init 和 mutableCopy,如何自动释放?
NSMutableArray 和 NSDictionary 错误