Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 打印NSMutableArray会导致崩溃,并且没有错误代码_Iphone_Objective C_Memory_Nsmutablearray - Fatal编程技术网

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:

尝试检查重新计数,例如:

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

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

此外,您可以尝试迭代sourceValues并将其内容打印到NSLog,但我不知道其中包含什么

最好的方法是使用RETAIN和use将类属性设置为MSMutableArray。dealloc将负责发布

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

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
是如何分配的?