2014-09-30 4 views
2

Сценарий SpriteKit с EXC_BAD_ACCESS после обновления до iOS8. Бывает случайное время, без видимых причин, после игры. Исключение точки останова, а также включение обнаружения NSZombie в Allocations/Instruments не дает никакой информации, поэтому я не могу обнаружить строку в моем коде, которая вызывает ошибку.EXC_BAD_ACCESS после обновления до игры iOS8 SpriteKit

Вот трассировку:

* thread #1: tid = 0x5d267, 0x2fd7c760 SpriteKit`SKCSprite::update(double) + 328, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0xc) 
frame #0: 0x2fd7c760 SpriteKit`SKCSprite::update(double) + 328 
frame #1: 0x2fd2cec8 SpriteKit`-[SKScene _update:] + 200 
frame #2: 0x2fd4a8ae SpriteKit`-[SKView(Private) _update:] + 686 
frame #3: 0x2fd47a44 SpriteKit`-[SKView renderCallback:] + 748 
frame #4: 0x2fd4485c SpriteKit`__29-[SKView setUpRenderCallback]_block_invoke + 116 
frame #5: 0x2fd75fcc SpriteKit`-[SKDisplayLink _callbackForNextFrame:] + 248 
frame #6: 0x2f91ad7a QuartzCore`CA::Display::DisplayLinkItem::dispatch() + 98 
frame #7: 0x2f91abe2 QuartzCore`CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 366 
frame #8: 0x341ca82e IOMobileFramebuffer`IOMobileFramebufferVsyncNotifyFunc + 90 
frame #9: 0x2d94a51c IOKit`IODispatchCalloutFromCFMessage + 256 
frame #10: 0x2c9dcbe4 CoreFoundation`__CFMachPortPerform + 132 
frame #11: 0x2c9ed022 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34 
frame #12: 0x2c9ecfbe CoreFoundation`__CFRunLoopDoSource1 + 346 
frame #13: 0x2c9eb5e0 CoreFoundation`__CFRunLoopRun + 1608 
frame #14: 0x2c938db0 CoreFoundation`CFRunLoopRunSpecific + 476 
frame #15: 0x2c938bc2 CoreFoundation`CFRunLoopRunInMode + 106 
frame #16: 0x33cc4050 GraphicsServices`GSEventRunModal + 136 
frame #17: 0x2ff04a30 UIKit`UIApplicationMain + 1440 
* frame #18: 0x001073cc p01g01`main(argc=1, argv=0x00456bd4) + 116 at main.m:16 

По-видимому, этот вопрос каким-то образом связан с SpriteKit.

На iOS7, однако, игра работает без проблем.

Есть ли другой способ найти и устранить проблему?

+0

Downvoting? Тогда возьмите трудность, чтобы объяснить свое действие. Спасибо. – kamneed

+0

Теперь это слепой снимок с предоставленной информацией. Но в iOS8 есть случаи, когда обновление пользовательского интерфейса внутри блока вызывает проблему, поэтому я предлагаю вам посмотреть там, где добавляются или удаляются узлы. Но опять же, это слепой выстрел, это происходит в каком-либо конкретном месте или просто при загрузке сцены? – gzafra

+0

@Willhem спасибо за ответ, к сожалению, я не могу предоставить какой-либо фрагмент кода, поскольку Xcode не сообщает, где эта проблема. И есть огромное количество кода. Это происходит через 10-20 секунд после начала интенсивной игры, никаких особых событий, чтобы придерживаться. Я попытаюсь выкопать его в направлении блока. – kamneed

ответ

1

Таким образом, проблема была в removeFromParent.

После изменения:

SKAction *remove = [SKAction removeFromParent]; 
[self runAction:[SKAction sequence:@[wait, remove]]]; 

к:

[self runAction:wait completion:^{ 
    [self removeFromParent]; 
}]; 

ошибка исчезла, но еще один появился:

SpriteKit`SKCShapeSprite::getAccumulatedBounds() 

Пожалуйста направиться SpriteKit: EXC_BAD_ACCESS SpriteKit`SKCShapeSprite::getAccumulatedBounds() crash для деталей.

ОБНОВЛЕНИЕ: Оказалось, что я опередил себя: после нескольких часов снова появилась ошибка. Теперь у меня есть два вида неразрешимых проблем, и я думаю о переписывании игры с нуля специально для iOS8.

+0

запускайте свое действие с помощью ключа и удалите ключ и узел, когда вы заблокируете (я просто догадываюсь), или установите узел на нуль, может быть помочь вам – dragoneye

0

Попробуйте это, установив уникальное имя для name. Я как-то работал на меня.

static NSInteger count = 0; 

@interface Power() 

- (instancetype)init 
{ 
    if (self = [super init]) { 
     count++; 
     self.name = @(count).stringValue; 
    } return self 
} 

@end 

Обратите внимание, что объекты снимаются не один раз. Может быть, потому что не смог отличить один объект от другого того же типа.

Смежные вопросы