Cocos2d box2d精灵位置崩溃



我有以下代码:

for (b2Body* b = world->GetBodyList(); b; b = b->GetNext())
{
    if (b->GetUserData() != NULL) 
    {               
        CCSprite *itemSprite = (CCSprite*)b->GetUserData();
        CGSize SpriteSize;
        SpriteSize.height = itemSprite.contentSize.height;
        SpriteSize.width = itemSprite.contentSize.width;
        CGPoint SpritePosition=[itemSprite position];           
    }
}

只是得到精灵的位置,但这个程序有时会崩溃:

SpriteSize.height = itemSprite.contentSize.height;

和这一行:

CGPoint SpritePosition=[itemSprite position];

我使用cocos2d .99.5。

Edit: 这是我的崩溃日志:

异常类型:EXC_BAD_ACCESS (SIGBUS)异常码:KERN_PROTECTION_FAILURE at 0x0000000f崩溃的线程:0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x00002666 objc_msgSend_stret + 14
1   ShootTheMonkey                  0x0004c066 -[LevelFour ccTouchBegan:withEvent:] (LevelFour.mm:1432)
2   ShootTheMonkey                  0x00321bf0 -[CCTouchDispatcher touches:withEvent:withTouchType:] (CCTouchDispatcher.m:238)
3   ShootTheMonkey                  0x00322454 -[CCTouchDispatcher touchesBegan:withEvent:] (CCTouchDispatcher.m:305)
4   ShootTheMonkey                  0x003240ec -[EAGLView touchesBegan:withEvent:] (EAGLView.m:318)
5   UIKit                           0x00053d72 -[UIWindow _sendTouchesForEvent:] + 254
6   UIKit                           0x000536fe -[UIWindow sendEvent:] + 74
7   UIKit                           0x0004f320 -[UIApplication sendEvent:] + 260
8   UIKit                           0x0004ec8c _UIApplicationHandleEvent + 4772
9   GraphicsServices                0x00003b2c PurpleEventCallback + 660
10  CoreFoundation                  0x00022d96 CFRunLoopRunSpecific + 2214
11  CoreFoundation                  0x000224da CFRunLoopRunInMode + 42
12  GraphicsServices                0x000030d4 GSEventRunModal + 108
13  GraphicsServices                0x00003180 GSEventRun + 56
14  UIKit                           0x0000342a -[UIApplication _run] + 374
15  UIKit                           0x00001954 UIApplicationMain + 636
16  ShootTheMonkey                  0x0000377e main (main.m:13)
17  ShootTheMonkey                  0x0000373c start + 32

由于您没有发布崩溃转储或堆栈跟踪,我只能猜测。我想至少有两个原因:

  1. 您将多个类的对象分配给body->SetUserData()。当您将用户数据强制转换为CCSprite时,当它实际上不是CCSprite时,就会发生崩溃。尽管我对此表示怀疑,因为通常人们会将同一类的对象分配给它。

  2. 第二个原因更有可能发生,因为人们通常依赖于CCLayer来保留其CCSprite子元素(而不是显式地保留它们)。当你从父CCLayer中移除CCSprites时,后者会释放前者,如果保留count == 0(很可能),CCSprites就会从堆中释放。但是请记住,一些b2Bodies仍然通过用户数据属性持有这些CCSprites的指针?所以当你迭代所有主体并尝试使用仍然附加在用户数据上的已发布CCSprites时会发生什么?崩溃!

解决这个问题的方法是,当相应的精灵从它们的CCLayer中移除时,你需要删除body,通过子类化CCSprite来添加一个指向b2Body的变量,或者通过在另一个类中包装两个对象(即精灵和body)。然后添加代码以在精灵即将被取消分配时移除主体。

希望这对你有帮助。如果没有,请发布更多详细信息(崩溃转储或堆栈跟踪)。

我们所知道的是精灵被分配给userData,然后它被释放了。我看到你分配的精灵是一个自动释放的对象,这更有可能意味着超出范围的精灵收到了释放信息。为了确保它是真实的,尝试如下创建精灵: [[CCSprite alloc] initWithSprite:@"apple.png"]; 但记住稍后你必须释放它。
如果它对你有效,使用上面的建议。

最新更新