2013-10-20 65 views
0

我的游戏有一个接收字符串的方法。自iOS7开始,它有时会崩溃。检查变量是否包含内存地址

在该方法中,我在该字符串上调用lowercaseString,然后它与EXC_BAD_ACCESS崩溃。

-(void)changeDirection:(NSString *)_direction { 
    if (![[direction lowercaseString] isEqualToString:[_direction lowercaseString]]) { 

    } 
} 

东西,我注意到的是,这时候,这串似乎是一个内存地址

enter image description here

这就解释了为什么会崩溃 - 我在记忆调用lowercaseString地址。

现在,最合理的解决方案是查看为什么此方法接收内存地址而不是实际的字符串,我猜。

但是,现在,我希望做一个快速的解决方法,这导致了这个问题:

如何检测给定参数是否像@"Hello" 或内存地址的实际字符串对象?

+0

可能是一个已经发布的NSString –

+4

在Objective-C中,所有对象都通过它们的内存地址进行传递,所以不存在检测参数是字符串对象还是内存地址的情况。最有可能'_direction'要么没有被初始化,要么被分配给它,但它指向的对象被删除。 – user1118321

回答

3

对象生活在堆上,你调用NSString实际上是一个指向它的指针。而指针是内存地址,所以这是预期的行为不成问题。

EXC_BAD_ACCESS意味着您正在以不良方式访问内存,即您指向的内存地址不是有效内存。

当您尝试访问悬挂指针(即指向已释放对象的指针)或未初始化的指针时,可能会发生这种情况。

错误不在您发布的代码中,而是在产生该方法的参数_direction的代码中。

+0

如何判断_direction中的任何谎言是否已被初始化? (除了让应用程序崩溃lol) – Voldemort

+1

您无法检测到悬挂或未初始化的指针。你必须仔细阅读代码,看看是否有一条路径导致错误的行为。静态分析仪在这种情况下有很多帮助。另外,你使用的是ARC吗? –

+0

我没有使用ARC。谢谢你! – Voldemort

相关问题