-1

在 didFinishLaunchingWithOptions 中,第一个代码是:

NSMutableArray *k = [[NSMutableArray alloc] initWithCapacity:10];
[k release];

(经过多次调试,我将其简化为这种情况)并且我得到了

*** -[__NSArrayM class]: message sent to deallocated instance 0x7576c90
*** -[__NSArrayM respondsToSelector:]: message sent to deallocated instance 0x7576c90

如果我在 alloc 行之后检查'k'上的 retainCount,它是 1。如果我用 NSArray 替换 NSMutableArray 一切都很好。这到底是怎么回事??

4

2 回答 2

1

该错误必须来自其他地方。这意味着你正在使用它。否则,你不会有

*** -[__NSArrayM respondsToSelector:]: message sent to deallocated instance 0x7576c90

但类似:

*** -[__NSArrayM release]: message sent to deallocated instance 0x7576c90

另外,您不应该使用 retainCount(请参阅此处的原因)。

只需检查您没有在其他任何地方使用它。或者,也许你正在使用 ARC ?在这种情况下,您不需要释放它。

于 2012-11-15T16:47:24.913 回答
0

如果您启用了僵尸并且仍然在控制台中看到错误,例如:

2013-08-26 16:08:22.540 测试[1231:303] * -[__NSDictionaryM respondsToSelector:]:消息发送到已释放实例 0x101b039a0

而且您已将代码精简为几行,并且您确定您没有过度释放该对象,该问题很可能是由于调试器在您单步跳过它时向已正确释放的对象发送消息引起的。当您不单步执行代码时,不会发出控制台消息。要看到它发生,请启用僵尸并单步执行以下代码。发布后,上述消息将发送到控制台。

-(void)testDictionary
{
  NSMutableDictionary *outboundDictionary = [[NSMutableDictionary alloc] init];
  [outboundDictionary release];
}
于 2013-08-26T21:26:10.443 回答