2011-01-13 66 views
0

我决定在下一行我的应用程序崩溃:打印一个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已被分配,释放它。”我怎样才能做到这一点?

+0

另外,如何分配`sourceValues`? – joshpaul 2011-01-13 15:23:02

回答

1

为什么不使用:

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

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

  • isMemberOfClass:
+0

问题仍然存在,但谢谢你的提示。 – CodeGuy 2011-01-13 14:34:11

+0

如果问题仍然存在,则意味着问题随释放您的对象而发生。您可能想向我们展示其余的代码。 – 2011-01-13 15:15:33

+1

如果`sourceValues`已经发布,那么`sourceValues`的测试量不会有帮助。 – bbum 2011-01-13 16:54:07

-1

尝试查看retainCount,是这样的:

的NSLog (@“retain count:%d”,[sourceValues retainCount]);

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

此外,您还可以尝试通过sourceValues迭代并打印其内容的NSLog,但我不知道里面有什么了。

最好的事情是使用RETAIN将类属性设置为MSMutableArray,并使用合成。 dealloc将负责释放。

如果上述被实现,则可以分配/初始化如下:

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

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

0

嗯,首先,有一个在释放nil对象没有危险。所以“如果sourceValues已被分配,释放它”的问题。可能是多余的。除非你正在做一些时髦的东西,你应该遵循常规的内存管理规则并调用[sourceValues release];dealloc

你试过用的断点上运行的一切(“构建和调试 - 断点论”在Xcode)?这通常会为您提供比通常的“构建和运行”更多的调试信息。

它可能是(我猜根据我过去曾经遇到的一些奇怪的问题)你已经处理了sourceValues,但指针仍然指向它的旧内存。如果出现这种情况,一个新的对象可能位于该区域该程序将尝试反正像对待一个NSMutableArray。

1

如果这...

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

...正在崩溃你的程序,这是因为sourceValues已经被释放。无论你在哪里releasesourceValues,将其设置为nil

[sourceValues release], sourceValues = nil; 

如果你的应用程序仍然崩溃,这是因为该数组已被过度释放到其他地方。也就是说,你没有正确平衡保留和释放。首先,尝试“构建和分析”并解决静态分析器识别的任何问题。接下来,打开僵尸检测并查看您第一次发送过度释放对象的位置。

请注意,[sourceValues class] == [NSMutableArray class]将无法​​正常工作,并且该模式不应该用于检查实例是否属于特定类。您应始终使用isKindOfClass:isMemberOfClass:

但是,由于无论如何都无法区分可变数组或不可变数组,所以没有必要首先检查。

相关问题