Debugging 未分配被释放的指针--如何在Xcode目标c中调试?
我需要一些帮助来理解如何使用调试工具——本主题之前的文章建议使用NSZombie和设置断点。这些对我不起作用,这意味着我不知道如何正确使用它们——或者如何解释它们告诉我的内容 基本上,我是在真空中工作的——在我的工作场所或社交圈中,没有人做目标c编程 这是违规代码。我的想法是制作100个物体的移动阵列。motionManager StartDeviceMotionUpdate使用ReferenceFrame方法调用例程motionDataArray。数组将被填充,当其长度达到100时,将删除第一个对象,因此数组中始终只有100个对象。这样,我想,我可以取数据的平均值,去除很多噪音 我想可能有更好的方法来实现这个目标,但以下是我想到的Debugging 未分配被释放的指针--如何在Xcode目标c中调试?,debugging,memory-management,ios6,nsdictionary,Debugging,Memory Management,Ios6,Nsdictionary,我需要一些帮助来理解如何使用调试工具——本主题之前的文章建议使用NSZombie和设置断点。这些对我不起作用,这意味着我不知道如何正确使用它们——或者如何解释它们告诉我的内容 基本上,我是在真空中工作的——在我的工作场所或社交圈中,没有人做目标c编程 这是违规代码。我的想法是制作100个物体的移动阵列。motionManager StartDeviceMotionUpdate使用ReferenceFrame方法调用例程motionDataArray。数组将被填充,当其长度达到100时,将删除第一
- (void) motionDataArray: (CMCalibratedMagneticField) field
{
NSDictionary *motionData = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithDouble: motionManager.deviceMotion.gravity.x],@"gravity_x",
[NSNumber numberWithDouble: motionManager.deviceMotion.gravity.y],@"gravity_y",
[NSNumber numberWithDouble: motionManager.deviceMotion.gravity.z],@"gravity_z",
[NSNumber numberWithDouble: field.field.x],@"mag_x",
[NSNumber numberWithDouble: field.field.y],@"mag_y",
[NSNumber numberWithDouble: field.field.z],@"mag_z",
[NSNumber numberWithDouble: `enter code here`locationManager.heading.magneticHeading],@"mag_heading",
[NSNumber numberWithDouble: motionManager.deviceMotion.attitude.roll],@"roll",
[NSNumber numberWithDouble: motionManager.deviceMotion.attitude.yaw],@"yaw",
[NSNumber numberWithDouble: motionManager.deviceMotion.attitude.pitch],@"roll",
nil];
//NSLog(@"%d",[motionArray count]);
if([timerArray count] > arrayCount - 1)
{
int i = [timerArray count] - arrayCount;
for (int j = 0; j < i + 1; j++)
{
[motionArray removeObjectAtIndex:0];
}
}
[motionArray addObject:motionData];
}
代码在大约前200次迭代中运行良好,然后出现崩溃和错误:未分配被释放的指针
任何关于如何解释仪器输出或任何其他调试方法的好建议都会对我有很大帮助,我相信其他人也会有帮助。非常感谢
蒂姆·雷德菲尔德(Tim Redfield)好的,我想我有一个解决方案——它运行时不会崩溃,阵列保持在最大100。但是,我真的不明白为什么它会起作用。除非使用@synchronize,否则数组似乎无法从中删除对象,如下所示:
if([timerArray count] > arrayCount - 1)
{
int i = [timerArray count] - arrayCount;
for (int j = 0; j < i + 1; j++)
{
@synchronized(timerArray) {
[timerArray removeObjectAtIndex:0];
}
}
}
我猜这与数组在分配对象之前移除对象有关,这似乎是因为代码循环的运行速度不一定与motionManager推送数据的速度相同。我仍在努力想这个问题。欢迎评论