【问题标题】:xcode tool to find memory issues, access of a pointer to a location of another variable ecc用于查找内存问题的 xcode 工具,访问指向另一个变量 ecc 位置的指针
【发布时间】:2011-08-08 15:27:17
【问题描述】:

我正在使用 cocos2d,但是问题很笼统。 我有课

CCNode *scaleLayer

在我设置的 touchesMoved 事件中

scaleLayer.scale=(some calculation)

如果我在设备中编译程序崩溃,在模拟器上运行良好。 如果我将 nslogs 放在先例指令之前,即使在设备中也能正常工作。 可能是一些内存、指针或它可能是什么? 但是,是否存在一个 xcode 工具可以让我找到或了解我的视线? 谢谢

代码如下:

- (void)ccTouchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSSet *allTouches = [event allTouches];
//NSLog(@"comincio");
switch ([allTouches count]) {
    case 2: { //Double Touch
        UITouch *t1 = [[allTouches allObjects] objectAtIndex:0];
        UITouch *t2 = [[allTouches allObjects] objectAtIndex:1];
        CGPoint p1=[self convertTouchToNodeSpace: t1];
        CGPoint p2=[self convertTouchToNodeSpace: t2];                  

        initialDistance = [self distanceBetweenTwoPoints:p1 B:p2];
        oldScale=scaleLayer.scale;
        NSLog(@"distanza iniz %f",initialDistance);
    } break;
            default:
        break;
}
}

-(void)ccTouchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint location;   
    UITouch *t1,*t2;    
    CGPoint p1,p2;

    NSSet *allTouces=[event allTouches];
    switch ([allTouces count]) {
case 2:
            //NSLog(@"2 tocchi");
            t1=[[allTouces allObjects] objectAtIndex:0];
            t2=[[allTouces allObjects] objectAtIndex:1];
            p1=[self convertTouchToNodeSpace: t1];
            p2=[self convertTouchToNodeSpace: t2];
            CGFloat finalDistance=[self distanceBetweenTwoPoints:p1 B:p2];
//if i put here NSLog("%f %f %f",oldScale,finalDistance,initialDistance); all goes well
            scaleLayer.scale=oldScale*finalDistance/initialDistance;
            NSLog(@"scala %f",scaleLayer.scale);//finalDistance/initialDistance);
//this nslog give me error if i not put that nslog before
            break;

        default:
            break;
    }
}

-(CGFloat)distanceBetweenTwoPoints:(CGPoint)A B:(CGPoint)B{
    float x=B.x-A.x;
    float y=B.y-A.y;
    return sqrt(x*x+y*y);
}

【问题讨论】:

  • 在哪里初始化 scaleLayer 变量?如果它没有被初始化,它可能是模拟器上的null(所以当你做.scale时它没有任何反应)但是设备上没有初始化垃圾(所以你会崩溃)。
  • 什么是崩溃日志..什么类型的崩溃..bad_access?

标签: iphone ios objective-c memory-management


【解决方案1】:

您可以使用的一个选项是zombies,它已经在stackoverflow中进行了解释,所以我不打算在这里做。

但如果您遇到 EXC_BAD_ACCESS 类型的错误,您可以添加异常断点。这有时也有帮助。这些是这样做的步骤

  1. 在断点导航器的左下角单击加号 按钮。
  2. 在弹出窗口中选择“添加异常断点”
  3. 选择异常类型。我通常选择“全部”例外
  4. 点击完成。

Apple 对此进行了解释 here

【讨论】:

  • 试过了,但是 scaleLayer 不是僵尸,它永远不会被释放
  • 虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。
  • 是的@Monolo 我理解你的担忧。当我链接到stackoverflow 或官方文档之外的页面时,我通常会在这里解释答案。在这种情况下,僵尸的用法已经在stackoverflow 中解释过,所以不用再解释了..
【解决方案2】:

尝试使用静态分析器(Shift-Command-A)构建

尝试查看内存地址。以下是一些帮助您入门的链接: scottmpeak.comSO discussion

【讨论】:

  • scaleLayer.scale 在 init 函数中被初始化为 =1,并且作为 child 添加的内容正确显示。当我尝试在 touchesMoved 中更改比例时,程序说 _scaleX != _scaleY 不知道要返回哪个。但是我改变了.scale,不仅是一个,而且我也只看到过一次,包含计算通过比例的变量,给出“nan”(我认为不是数字)。我认为一些指针正在访问该内存区域,不经意地改变了该值。静态分析器没有发现任何问题
  • mike 我已经阅读了 scottmpeak.com,但是要使用 malloc.c 和 ckheap.h 我必须覆盖一些东西或者只是将它们添加到我的项目中?
猜你喜欢
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 2012-06-07
  • 2021-10-20
  • 2023-03-16
  • 2021-12-10
相关资源
最近更新 更多