2010-07-26 83 views
1

我是iPhone开发新手,我有一个EXC_BAD_ACCESS错误。错误EXC_BAD_ACCESS

在我的.h文件,我宣布:

NSString *myString; 

在我的.m文件,我有两种方法:

1. CLLocationManager接口(无效)的LocationManager,当我做到这一点:

myString = [NSString stringWithFormat:@"%lf",loc.longitude]; 
NSLog(@"%@",myString); // it works 

2.A(无效)sendPosition法:

NSLog(@"%@",myString); // EXC_BAD_ACCESS 

你能帮我吗?

回答

2
  1. 保留你的字符串。

    myString = [[NSString stringWithFormat:@“%lf”,loc.longitude] retain];

  2. 然后,在这个类的您的dealloc方法(或将其添加)

    - (无效)的dealloc { [超级的dealloc]; [myString release]; }

应该修复它,假设你已经在你的.h文件中声明了myString。

+0

这是因为NSString是自动发布的,如果你想让它挂起,需要保留它。或者,你可以使它成为一个保留的属性,而不必调用retain(注意你仍然必须在dealloc中释放它) – jrtc27 2010-07-26 10:26:27

+0

谢谢,它可以工作,但myString的值可能会改变。有了保留,价值永远是一样的。 – 2010-07-26 10:55:57

+1

如果您的值可以更改,请使用可变字符串,然后更改该值。否则,释放它并在创建新值时再次设置它。说真的,看看我的答案,阅读规则(你需要了解他们),当你遇到这样的问题时,停下来思考。通常有一个简单的解决方案。 – jer 2010-07-26 11:07:06

1

您是否将yourString保留在locationManager方法的其他位置?如果没有,你应该,然后在你的-dealloc方法中释放它。否则,它可能会消失,就像我怀疑现在正在发生的事情。请阅读rules for memory management

我建议的是创建一个属性,该属性在您的类上自动保留该值,然后在创建字符串时用点表示法赋值。再次,在你的dealloc方法中释放它。对于这种类型的代码,这是习惯用法。