Iphone 打印NSMutableArray会导致崩溃,并且没有错误代码
我确定我的应用程序在以下行崩溃:Iphone 打印NSMutableArray会导致崩溃,并且没有错误代码,iphone,objective-c,memory,nsmutablearray,Iphone,Objective C,Memory,Nsmutablearray,我确定我的应用程序在以下行崩溃: if(sourceValues != nil && [sourceValues class] == [NSMutableArray class]) [sourceValues release]; “sourceValues”在类的顶部声明为NSMutableArray。满足“if”循环,并进行[sourceValues release]调用,这会使程序崩溃,并且没有错误代码。那么,既然sourceValues!=nil,而且由于[sou
if(sourceValues != nil && [sourceValues class] == [NSMutableArray class])
[sourceValues release];
“sourceValues”在类的顶部声明为NSMutableArray。满足“if”循环,并进行[sourceValues release]调用,这会使程序崩溃,并且没有错误代码。那么,既然sourceValues!=nil,而且由于[sourceValues类]=[NSMutableArray类],我想知道sourceValues到底是什么。因此,在“if”循环上方,我添加了以下内容:
NSLog(@"sourceValues is %@", sourceValues);
但是我的程序不会打印它。它只是崩溃了,在那一行没有错误代码。所以,如果sourceValue存在,并且它是一个NSMutableArray,为什么不打印它呢。这里有什么问题
我试图让代码显示“如果已分配sourceValues,请释放它”。我如何才能做到这一点?为什么不使用:
if(sourceValues != nil && [sourceValues isKindOfClass:[NSMutableArray class]])
[sourceValues release];
您可能需要使用其他方法,如:
isMemberOfClass:
self.sourceValues = [[[NSMutableArray alloc] init] autorelease];
然后根据需要将对象直接添加到self.sourceValues。无需担心释放,它将在dealoc中完成。首先,释放
nil
对象没有危险。因此,“如果已分配sourceValues,则释放它”的问题可能是多余的。除非你在做一些古怪的事情,否则你应该遵循常规的内存管理规则,只需调用[sourceValues release]代码>在dealloc
您是否尝试过在Xcode中使用断点(“buildanddebug-breakpoints-on”)运行所有东西?这通常比通常的“构建并运行”提供更多的调试信息
可能是(我根据过去遇到的一些奇怪问题猜测)您实际上已经解除了sourceValues
的分配,但指针仍然指向它的旧内存。如果发生这种情况,一个新对象可能位于该区域,程序将尝试将其视为NSMutableArray
NSLog(@"sourceValues is %@", sourceValues);
。。。正在使您的程序崩溃,这是因为sourceValues
已经发布。无论您在哪里释放sourceValues
,都将其设置为nil
[sourceValues release], sourceValues = nil;
如果你的应用程序仍在崩溃,那是因为阵列已在其他地方过度发布。也就是说,您没有正确平衡保留和释放。首先,尝试“构建和分析”,并修复静态分析器识别的任何问题。下一步,打开僵尸检测,并查看第一次向过度释放的对象发送消息的位置
请注意,[sourceValues class]==[NSMutableArray class]
将不起作用,并且不应使用该模式检查实例是否属于特定类。您应该始终使用isKindOfClass:
或isMemberOfClass:
但是,由于您无论如何都无法区分可变数组和不可变数组,因此没有必要首先进行检查。自动删除对于我使用的设置不起作用。我不是用dealloc来澄清问题的。为什么不用dealloc呢?不要让事情对你自己更难;)<代码>-不应使用重新计数
。即使是调试也不行。@t不能直接调用dealloc
。不曾经(以防笑话失败)@everyone:如果tbone为自己的一方辩护,那么就收回他的-1票。但我没有使用dealloc。如果你没有使用dealloc,难道没有一种方式可以说“如果已经分配了X,就释放它”吗?听起来你好像做错了什么。。。释放永远不会真正“释放”任何内存;它只负责将保留计数降低1。如果retain计数达到0,则调用dealloc释放内存。为什么不释放它呢?您可以将release发送到nil,而不会产生任何不利影响。在数组中不应该有一行代码调用dealloc
。如果他班上没有dealoc
,那当然是个问题,但是[sourceValues dealoc]代码>将是完全错误的(重申显而易见的)。@bbum是的,当然:)“我没有使用dealloc”在使用Objective C时根本不正确,因为它是自动调用的。如果问题仍然存在,则意味着问题与对象的释放有关。您可能想向我们展示代码的其余部分。如果sourceValues
已经发布,那么对sourceValues
进行大量的测试都不会有帮助。另外,sourceValues
是如何分配的?