清除NSarrays的NSDictionary

时间:2011-08-30 15:02:49

标签: iphone objective-c ios cocoa-touch

我花了很多时间尝试数百件事,并在互联网上搜索我的问题,但我没有发现任何问题,所以我希望你们能够帮助我:)。

所以,当我解析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变量都没有被释放...我错了吗?这让我发疯了><

4 个答案:

答案 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方法吗?