打印NSMutableArray会导致崩溃而不会出现错误代码

时间:2011-01-13 14:00:33

标签: iphone objective-c memory nsmutablearray

我确定我的应用程序在以下行崩溃了:

if(sourceValues != nil && [sourceValues class] == [NSMutableArray class])
    [sourceValues release];

“sourceValues”在我的班级顶部被声明为NSMutableArray。满足“if”循环,并进行[sourceValues release]调用,这会使程序崩溃而没有错误代码。所以,既然sourceValues!= nil,而且[sourceValues class] == [NSMutableArray class],我想知道究竟是什么sourceValues。因此,在“if”循环之上,我添加了以下内容:

NSLog(@"sourceValues is %@", sourceValues);

但我的程序不会打印出来。它只是在该行没有错误代码崩溃。因此,如果sourceValue存在并且如果它是NSMutableArray,为什么不打印它。这里有什么问题?

我正在尝试使用“如果已分配sourceValues,则释放它”的代码。我怎么能这样做?

4 个答案:

答案 0 :(得分:1)

为什么不使用:

if(sourceValues != nil && [sourceValues isKindOfClass:[NSMutableArray class]])
    [sourceValues release];

您可能想要使用其他方法,例如:

  • isMemberOfClass:

答案 1 :(得分:1)

如果这......

NSLog(@"sourceValues is %@", sourceValues);

...正在崩溃你的程序,因为sourceValues已经被释放了。无论您release sourceValues,请将其设置为nil

[sourceValues release], sourceValues = nil;

如果您的应用仍在崩溃,那是因为该阵列已在其他地方过度发布。也就是说,您没有正确平衡保留和释放。首先,尝试“构建和分析”并修复静态分析器识别的任何问题。接下来,打开僵尸检测并查看您首次向过度释放的对象发送消息。

请注意,[sourceValues class] == [NSMutableArray class]将不起作用,并且永远不应使用该模式来检查实例是否属于特定类。您应始终使用isKindOfClass:isMemberOfClass:

但是,既然你无法分辨出可变数组或不可变数组之间的区别,那么首先检查是没有意义的。

答案 2 :(得分:0)

嗯,首先,释放nil对象没有危险。因此,“如果已经分配了sourceValues,则将其释放”。可能是多余的。除非您正在做一些时髦的事情,否则您应该遵循常规的内存管理规则,只需在[sourceValues release];

中致电dealloc

您是否尝试使用断点运行所有内容(Xcode中的“构建和调试 - 断点开启”)?这通常比通常的“构建和运行”提供更多的调试信息。

可能(我猜测基于我过去遇到的一些奇怪问题)你实际上已经释放了sourceValues但指针仍然指向它的旧内存。如果发生这种情况,新对象可能位于该区域,程序将尝试将其视为NSMutableArray。

答案 3 :(得分:-1)

尝试检查retainCount,例如:

NSLog(@“保留计数:%d”,[sourceValues retainCount]);

仅用于测试/调试,不要在if语句中依赖它。

此外,您可以尝试迭代sourceValues并将其内容打印到NSLog,但我不知道那里有什么。

最好的办法是使用RETAIN将类属性设置为MSMutableArray,并使用synthesize。 dealloc将负责释放。

如果实现了上述内容,您可以按如下方式分配/ init:

self.sourceValues = [[[NSMutableArray alloc] init] autorelease];

然后根据需要将对象直接添加到self.sourceValues。无需担心发布,它将在dealloc中完成。