7

我有一个我无法理解的错误,这是在我想释放 NSMutableDictionary 中的所有对象时发生的。

它发生在一个名为body的自定义对象上,输出为:

-[__NSTaggedDate body]: unrecognized selector sent to instance 0xffffffffffffffff

我在互联网上发现了关于它的非常糟糕的信息。

4

4 回答 4

9

那是Apple的私人课程。当您弄乱内存管理时,通常会发生此类错误。

你为什么要释放字典中的所有对象?当您将对象添加到字典(或数组)时,字典将保留它(获取所有权)。当您从字典中删除对象时,它将被释放,您不必这样做。

您是否已经考虑使用ARC?它使内存管理变得更加容易。您不必再担心保留和释放对象。

于 2012-09-13T15:24:15.333 回答
6

这是一个内部无证可可类。但是你并不关心它,因为它并不是真正发生的事情,它可能是出于复杂的解释和无关的原因而发生的红鲱鱼。

看报的地址:0xffffffffffffffff。这是一个没有意义的价值。如果不是因为那个红鲱鱼,你应该有一个分段错误。

您出于某种原因将消息发送body到无效指针(可能是某处的某些损坏的数据?)。

于 2012-09-13T15:28:24.710 回答
3

不知道这个类,但它可能是一个私有类(我敢打赌,它是使用“标记指针”技巧的 NSDate 对象的内部表示,但我只是猜测)。

无论如何,您的崩溃不是发生在调用的对象body,而是在调用调用的方法body发生。崩溃可能是由于代码中的内存管理不善导致内存损坏

  • 您应该在调试中运行您的应用程序时激活 Zombies 以帮助您跟踪过度释放的对象
  • 您通常不必保留和释放NSDictionary自己的对象,因为容器类喜欢NSArrayNSDictionary保留它们所持有的对象,并在从它们中删除对象时释放它们。所以我不明白为什么你“想要释放 NSMutableDictionary 中的所有对象”:你只需要调用它就完成removeAllObjectsNSDictionary,不需要自己调用release对象(你也不需要retain调用在字典中添加对象时)
于 2012-09-13T15:27:46.797 回答
-1

每当您尝试将一种数据类型设置为另一种数据类型时,例如“如果您直接将日期组件分配给 UIlabel 的文本”,在这种情况下,我就会发生

[toDateLabel setText:[tempArr lastObject]];                                   // Cause

[toDateLabel setText:[NSString stringWithFormat:@"%@",[tempArr lastObject]]]; // Solution
于 2017-02-07T11:26:45.843 回答