NSMutableArray发布两次

时间:2012-11-15 16:22:26

标签: ios nsmutablearray retain dealloc

在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,一切都很好。到底发生了什么事???

2 个答案:

答案 0 :(得分:1)

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

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

但是像:

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

另外,您不应该使用retainCount(请参阅here)。

请检查您是否在其他地方使用它。或者你可能正在使用ARC?在这种情况下,您无需释放它。

答案 1 :(得分:0)

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

2013-08-26 16:08:22.540 test [1231:303] * - [__ NSDictionaryM respondsToSelector:]:发送到解除分配的实例0x101b039a0的消息

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

-(void)testDictionary
{
  NSMutableDictionary *outboundDictionary = [[NSMutableDictionary alloc] init];
  [outboundDictionary release];
}