iPhone:一般调试技巧

iPhone:一般调试技巧,iphone,memory-management,Iphone,Memory Management,我已经做了8个月左右的iPhone开发工作,总体生活很好(openGL lol除外) 我正在制作一款iPhone 3D游戏,一切都进行得很顺利。它在模拟器上运行良好(我知道不是真正的测试),在设备上运行良好 现在它似乎死在设备上,指向一些非常随机的东西。它第一次死亡(“EXC_BAD_ACCESS”)是委托的设置 NSString *url = [NSString stringWithFormat:@"%@GetPlayerPosition.aspx?playerIndex=%@", self.

我已经做了8个月左右的iPhone开发工作,总体生活很好(openGL lol除外)

我正在制作一款iPhone 3D游戏,一切都进行得很顺利。它在模拟器上运行良好(我知道不是真正的测试),在设备上运行良好

现在它似乎死在设备上,指向一些非常随机的东西。它第一次死亡(“EXC_BAD_ACCESS”)是委托的设置

NSString *url = [NSString
stringWithFormat:@"%@GetPlayerPosition.aspx?playerIndex=%@",
self.baseURL, self.deviceID];
__block ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:url]];    
[request setDelegate:self];
所以我只是删除了代码

它下一次死亡是在尝试访问GLFloat数组时

GLfloat v[]={center[0]-eye[0], 中心[1]-眼睛[1],中心[2]- 眼睛[2]}

再次非常随机,并一直工作到现在。就好像它的内存用完了,然后就满了一样。有人知道我的想法吗?班级人数有限制吗

一般来说,我可以解决这个问题,但我甚至回到了一个工作版本,重新实现了一些代码,然后开始了随机行为

我检查了有无泄漏,我很好

更新:第2部分

就在我的界面中,在我的.h文件中

GLfloat eye[3];
在my.m中,我可以为每个元素指定一个值,它可以正常工作

如果我这样做

NSLog(@"%f",eye[0]);

它崩溃了。为什么会这样?(用于工作)

EXC\u BAD\u访问通常是过早释放的症状(例如,由于释放了太多次而试图访问已释放的对象)

它工作得很好[…]现在似乎死了


听起来您应该查看修订日志,看看这两个时间戳之间发生了什么变化。

EXC\u BAD\u访问通常是过早释放的症状(例如,由于释放了太多次而试图访问释放的对象)

它工作得很好[…]现在似乎死了

听起来您应该查看修订日志,看看这两个时间戳之间发生了什么变化。

  • 如果发生崩溃(或多个崩溃),将有回溯。把它们寄出去

  • 尝试“构建并分析”。修正它给你的任何警告。修复编译器给你的任何警告。编写正确的应用程序应在编译时不发出警告

  • 为什么那行代码上有
    \u块
    ?那里似乎没有任何与街区相关的东西

在编写软件时,任何东西都不会随机中断。如果某个看似不相关的更改导致崩溃,那么代码很可能总是被破坏,但直到后来的更改才导致致命问题


由于您没有写入
请求
,因此没有理由将该变量标记为
\u块
。由于
\u块
将导致
请求
不被保留,因此可能是对象被过早释放和释放。也许吧

如何分配浮点数组?

  • 如果发生崩溃(或多个崩溃),将有回溯。把它们寄出去

  • 尝试“构建并分析”。修正它给你的任何警告。修复编译器给你的任何警告。编写正确的应用程序应在编译时不发出警告

  • 为什么那行代码上有
    \u块
    ?那里似乎没有任何与街区相关的东西

在编写软件时,任何东西都不会随机中断。如果某个看似不相关的更改导致崩溃,那么代码很可能总是被破坏,但直到后来的更改才导致致命问题


由于您没有写入
请求
,因此没有理由将该变量标记为
\u块
。由于
\u块
将导致
请求
不被保留,因此可能是对象被过早释放和释放。也许吧


如何分配浮点数组?

如何声明中心和眼睛?它们是实例变量、全局变量还是静态变量?在回调发生时,这些数组的内存可能已被释放(这也解释了初始化浮点数组的行失败的原因)。

中心和眼睛是如何声明的?它们是实例变量、全局变量还是静态变量?可能是在回调发生时,这些数组的内存已被释放(这也解释了初始化浮点数组的行失败的原因)。

中心[3]和眼睛[3]不应该被释放,我没有将它们设置为属性,因为我认为您不能。中心[3]和眼睛[3]不应该被释放,我没有将它们设置为属性,因为我认为您不能。它们在接口(.h)GLfloat center[3]中声明;GLfloat-eye[3];它们是类实例变量吗?如果是这样的话,可能类已经被释放了——通常块使用的任何东西都会被保留,但是由于这些是基本类型,我很确定它们不会导致保存它们的类被保留。一种可能有帮助的技术是将正在创建的AsiHttpRequest对象保留为类实例变量,并确保在类的dealloc中取消请求。正如所说,它们只是在公共接口中声明的。即使我将块完全取出,它也会在原语上消失,稍后我添加了NSLog(@“%f”,eye[0]);即使通过调试器在接口文件中的何处填充了浮点,它也会在访问时崩溃。如果在@interface/@end之间,则为类实例变量。如果它在@interface块之外,则它是一个全局变量。尝试NSLog(@“%f%@”,眼睛[0],自我);并查看崩溃是否消失(因为它会导致self被保留);GLfloat-eye[3];它们是类实例变量吗?如果是这样的话,可能类已经被释放了——通常块使用的任何东西都会被保留,但是由于这些是基本类型,我很确定它们不会导致保存它们的类被保留。一种可能有用的技术是将正在创建的AsiHttpRequest对象保持为类实例变量