我花了很多时间尝试数百件事,并在互联网上搜索我的问题,但我没有发现任何问题,所以我希望你们能够帮助我:)。
所以,当我解析XML文档时,我有NSMutableDictionary
填充NSArrays
。我的问题是,我想在发布它之前将其清空,因为它似乎会导致泄漏!
对我而言,最佳解决方案是:[myDict removeObjectsForKeys : [myDict allKeys]]
但应用程序崩溃,我在控制台中收到以下消息:
*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0)'
我真的无法理解为什么......任何想法?
修改
重要的一点,我忘记了(我猜...),我正在调用的字典在我的应用程序Delegate中,appDelegate = [[UIApplication sharedApplication] delegate];
。 (appDelegate在我的.h中使用myAppDelegate类类型定义)。
然后,我将其初始化为:appDelegate.myDict = [[NSMutableDictionary alloc] init];
是不是错了?
当我做的时候,有点奇怪:
[appDelegate.myDict release];
NSLog( @"%@", appDelegate.myDict);
我填写了字典......
编辑2
我刚刚发现当我打电话给[appDelegate.myVariable release]
时我的所有appDelegate变量都没有被释放...我错了吗?这让我发疯了><
答案 0 :(得分:3)
当您释放字典或数组时,它会释放其中的所有元素。如果你得到泄漏,他们不是因为没有移除物体。
当然,在您的情况下,问题的一部分似乎是您不知道错误发生的位置。 -[NSCFArray objectAtIndex:]: index (0) beyond bounds (0)
表示您正在(空)objectAtIndex
上执行NSArray
,如果您在NSDictionary上执行[myDict removeObjectsForKeys : [myDict allKeys]]
,则不会(直接)执行此操作。所以你需要找出错误的来源。
答案 1 :(得分:2)
这个怎么样:
// myDict should be NSMutableDictionary
[myDict removeAllObjects];
答案 2 :(得分:1)
这应该可以确定哪些键(或多个键)指向行为不端的数组。
for ( NSString *key in [myDict allKeys]) {
NSLog(@" key - %@", key);
[myDict removeObjectForKey: key];
}
NSLog(@" the problem is not with the dictionary...");
答案 3 :(得分:0)
在发布之前,您无需清空NSMutableDictionary
。字典release
时,字典保留的任何对象都会发送dealloc
消息。
听起来好像你的阵列被保留在别处,导致泄漏。您确定已经为所有对象(视图控制器,模型对象等)正确实现了dealloc
方法吗?