我确定我的应用程序在以下行崩溃了:
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,则释放它”的代码。我怎么能这样做?
答案 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中完成。