Sprite kit 在设备上推进模拟时exc_错误访问

Sprite kit 在设备上推进模拟时exc_错误访问,sprite-kit,exc-bad-access,skemitternode,Sprite Kit,Exc Bad Access,Skemitternode,此错误仅在实际设备上发生。在Xcode 6的模拟器上运行时,它不会崩溃 我正在创造外层空间,天空中有随机的流星划过。 在场景中,调用[goToSpace],它通过使用三个SKEmitterNodes模拟深度来设置星场。然后一个定时器被初始化,它发送星光 在星场初始化过程中,有必要推进三个骷髅节点的模拟,以获得完整的恒星天空。当调用行[emitterNode1 AdvancesSimulationTime:lifetime]时,我获得exc_bad_访问权限。我按照教程来启用NSZombie,但这

此错误仅在实际设备上发生。在Xcode 6的模拟器上运行时,它不会崩溃

我正在创造外层空间,天空中有随机的流星划过。 在场景中,调用[goToSpace],它通过使用三个SKEmitterNodes模拟深度来设置星场。然后一个定时器被初始化,它发送星光

在星场初始化过程中,有必要推进三个骷髅节点的模拟,以获得完整的恒星天空。当调用行[emitterNode1 AdvancesSimulationTime:lifetime]时,我获得exc_bad_访问权限。我按照教程来启用NSZombie,但这并没有帮助

在我的一生中,我都无法找到为什么我会获得exc\u bad\u访问权限。我使用Parse.com的崩溃报告,它提供了以下堆栈:

> Stack Trace Thread 0 (crashed) 0 libsystem_platform.dylib
> OSSpinLockLock @ 0x4 1 SpriteKit SKSpinLockSync(int*, void ()
> block_pointer) @ 0x20 2 SpriteKit
> -[SKTexture loadImageData] @ 0xec 3 SpriteKit
> -[SKTexture size] @ 0x28 4 SpriteKit SKCEmitterSprite::update(double) @ 0x117c 5 CorpBoard @ 0x48d44 6 CorpBoard @ 0xfbc50 7 CorpBoard @
> 0xfa6f0 8 CorpBoard @ 0xfa070 9 UIKit
> -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] @ 0x21c 10 UIKit
> -[UITableView _updateVisibleCellsNow:isRecursive:] @ 0x934 11 UIKit
> -[UITableView layoutSubviews] @ 0xa8 12 UIKit
> -[UIView(CALayerDelegate) layoutSublayersOfLayer:] @ 0x238 13 QuartzCore
> -[CALayer layoutSublayers] @ 0xa4 14 QuartzCore CA::Layer::layout_if_needed(CA::Transaction*) @ 0x13c 15 QuartzCore
> CA::Layer::layout_and_display_if_needed(CA::Transaction*) @ 0x1c 16
> QuartzCore CA::Context::commit_transaction(CA::Transaction*) @ 0x110
> 17 QuartzCore CA::Transaction::commit() @ 0x1b0 18 QuartzCore
> CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned
> long, void*) @ 0x4c 19 CoreFoundation
> __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ @ 0x1c 20 CoreFoundation
> __CFRunLoopDoObservers @ 0x164 21 CoreFoundation
> __CFRunLoopRun @ 0x340 22 CoreFoundation CFRunLoopRunSpecific @ 0x188 23 GraphicsServices GSEventRunModal @ 0xa4 24 UIKit UIApplicationMain
> @ 0x5cc 25 CorpBoard @ 0x5be80 26 libdyld.dylib start @ 0x0 Thread 1 0
> libsystem_kernel.dylib kevent64 @ 0x8 1 libdispatch.dylib
> _dispatch_mgr_invoke @ 0x110 2 libdispatch.dylib
> _dispatch_mgr_thread @ 0x30 Thread 2 0 libsystem_kernel.dylib
> __workq_kernreturn @ 0x8 1 libsystem_pthread.dylib
> _pthread_wqthread @ 0x3dc 2 libsystem_pthread.dylib start_wqthread @ 0x0 Thread 3 0 libsystem_kernel.dylib
> __workq_kernreturn @ 0x8 1 libsystem_pthread.dylib
> _pthread_wqthread @ 0x3dc 2 libsystem_pthread.dylib start_wqthread @ 0x0 Thread 4 0 libsystem_kernel.dylib
> __workq_kernreturn @ 0x8 1 libsystem_pthread.dylib
> _pthread_wqthread @ 0x3dc 2 libsystem_pthread.dylib start_wqthread @ 0x0 Thread 5 0 libsystem_kernel.dylib
> __workq_kernreturn @ 0x8 1 libsystem_pthread.dylib
> _pthread_wqthread @ 0x3dc 2 libsystem_pthread.dylib start_wqthread @ 0x0 Thread 6 0 libsystem_kernel.dylib
> __workq_kernreturn @ 0x8 1 libsystem_pthread.dylib
> _pthread_wqthread @ 0x3dc 2 libsystem_pthread.dylib start_wqthread @ 0x0 Thread 7 0 libsystem_kernel.dylib mach_msg_trap @ 0x8 1
> libsystem_kernel.dylib mach_msg @ 0x44 2 CoreFoundation
> __CFRunLoopServiceMachPort @ 0xc4 3 CoreFoundation
> __CFRunLoopRun @ 0x3a8 4 CoreFoundation CFRunLoopRunSpecific @ 0x188 5 Foundation
> -[NSRunLoop(NSRunLoop) runMode:beforeDate:] @ 0x138 6 Foundation
> -[NSRunLoop(NSRunLoop) run] @ 0x5c 7 CorpBoard @ 0x206a28 8 Foundation
> __NSThread__main__ @ 0x42c 9 libsystem_pthread.dylib
> _pthread_body @ 0xa0 10 libsystem_pthread.dylib
> _pthread_start @ 0x9c 11 libsystem_pthread.dylib thread_start @ 0x0 Thread 8 0 libsystem_kernel.dylib mach_msg_trap @ 0x8 1
> libsystem_kernel.dylib mach_msg @ 0x44 2 CoreFoundation
> __CFRunLoopServiceMachPort @ 0xc4 3 CoreFoundation
> __CFRunLoopRun @ 0x3a8 4 CoreFoundation CFRunLoopRunSpecific @ 0x188 5 CFNetwork
> +[NSURLConnection(Loader) _resourceLoadLoop:] @ 0x1b4 6 Foundation
> __NSThread__main__ @ 0x42c 7 libsystem_pthread.dylib
> _pthread_body @ 0xa0 8 libsystem_pthread.dylib
> _pthread_start @ 0x9c 9 libsystem_pthread.dylib thread_start @ 0x0 Thread 9 0 libsystem_kernel.dylib
> __select @ 0x8 1 CoreFoundation
> __CFSocketManager @ 0x290 2 libsystem_pthread.dylib
> _pthread_body @ 0xa0 3 libsystem_pthread.dylib
> _pthread_start @ 0x9c 4 libsystem_pthread.dylib thread_start @ 0x0 Thread 10 0 libsystem_kernel.dylib mach_msg_trap @ 0x8 1
> libsystem_kernel.dylib mach_msg @ 0x44 2 CoreFoundation
> __CFRunLoopServiceMachPort @ 0xc4 3 CoreFoundation
> __CFRunLoopRun @ 0x3a8 4 CoreFoundation CFRunLoopRunSpecific @ 0x188 5 CoreFoundation CFRunLoopRun @ 0x6c 6 CoreMotion @ 0x4298c 7
> libsystem_pthread.dylib
> _pthread_body @ 0xa0 8 libsystem_pthread.dylib
> _pthread_start @ 0x9c 9 libsystem_pthread.dylib thread_start @ 0x0 Thread 11 0 libsystem_kernel.dylib
> __workq_kernreturn @ 0x8 1 libsystem_pthread.dylib
> _pthread_wqthread @ 0x3dc 2 libsystem_pthread.dylib start_wqthread @ 0x0
相关代码:

NSTimer *space;

-(void)goToSpace {

    [self shootingStar];

    double lifetime;
    SKEmitterNode *emitterNode1 = [self starFieldEmitter:[SKColor lightGrayColor] starSpeedY:1 starsPerSecond:.1 starScaleFactor:0.08];

    lifetime = self.frame.size.height * [[UIScreen mainScreen] scale] / 1;
    [emitterNode1 advanceSimulationTime:lifetime];
    emitterNode1.zPosition = -10;
    [self addChild:emitterNode1];

    SKEmitterNode *emitterNode2 = [self starFieldEmitter:[SKColor lightGrayColor] starSpeedY:.8 starsPerSecond:.08 starScaleFactor:0.06];
    emitterNode2.zPosition = -11;
    lifetime = self.frame.size.height * [[UIScreen mainScreen] scale] / .8;
    [emitterNode2 advanceSimulationTime:lifetime];
    [self addChild:emitterNode2];

    SKEmitterNode *emitterNode3 = [self starFieldEmitter:[SKColor grayColor] starSpeedY:.5 starsPerSecond:.5 starScaleFactor:0.03];
    emitterNode3.zPosition = -12;
    lifetime = self.frame.size.height * [[UIScreen mainScreen] scale] / .5;
    [emitterNode3 advanceSimulationTime:lifetime];
    [self addChild:emitterNode3];

    space = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(shootingStar) userInfo:nil repeats:YES];

}

-(SKEmitterNode *)starFieldEmitter:(SKColor *)color starSpeedY:(CGFloat)starSpeedY starsPerSecond:(CGFloat)starsPerSecond starScaleFactor:(CGFloat) starScaleFactor {

    SKEmitterNode *emitterNode = [SKEmitterNode node];

    CGFloat lifetime = self.frame.size.height * [[UIScreen mainScreen] scale] / starSpeedY;

    emitterNode.particleTexture = [SKTexture textureWithImage:[UIImage imageNamed:@"stars"]];
    emitterNode.particleBirthRate = starsPerSecond;
    emitterNode.particleColor = [SKColor lightGrayColor];
    emitterNode.particleSpeed = starSpeedY * -1;
    emitterNode.particleScale = starScaleFactor;
    emitterNode.particleColorBlendFactor = 1;
    emitterNode.particleLifetime = lifetime;

    int rndValue = 1 + arc4random() % (45 - 1);
    emitterNode.particleRotation = rndValue;

    emitterNode.position = CGPointMake(self.frame.size.width / 2, self.frame.size.height);
    emitterNode.particlePositionRange = CGVectorMake(self.frame.size.width, self.frame.size.height);
    return emitterNode;
}

-(BOOL) getYesOrNo {

    int tmp = (arc4random() % 30)+1;
    if(tmp % 5 == 0)
        return YES;
    return NO;
}

-(void)shootingStar {

    BOOL left = [self getYesOrNo];
    int xPos = 0;
    int height = self.frame.size.height;
    int yPos = 1 + arc4random() % (height - 1);
    if (left) {
        xPos = -50;
    } else {
        xPos = self.frame.size.width + 50;
    }

    SKEmitterNode *shootingstar = [SKEmitterNode node];
    shootingstar =  [NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle] pathForResource:@"spark" ofType:@"sks"]];

    CGPoint xy = CGPointMake(xPos, yPos);
    shootingstar.position = xy;
    shootingstar.name = @"shootingStar";
    shootingstar.zPosition = -2.0;
    shootingstar.targetNode = self.scene;
    [self addChild:shootingstar];

    //make random size to simulate distance
    float val = [self randFloatBetween:.1 and:.5];
    SKAction *scale = [SKAction scaleBy:val duration:0];
    [shootingstar runAction: scale completion:nil];

    //now set speed depending on size (smaller = farther = slower)
    int dur = 0;
    if (val < .2) dur = 5;
    else if (val < .35) dur = 3;
    else dur = 2;

    int moveY = -500 + arc4random() % (500 - -500);
    int moveX;
    if (left) {
        moveX = 500;
    } else {
        moveX = -500;
    }
    SKAction *move = [SKAction moveByX:moveX y:moveY duration:dur];
    int waitDuration = 2 + arc4random() % (5 - 2);
    SKAction *wait = [SKAction waitForDuration:waitDuration];
    SKAction *sequence = [SKAction sequence:@[wait, move]];

    [shootingstar runAction:sequence completion:^{
        [shootingstar removeFromParent];
        //[self shootingStar];
    }];
}

-(float) randFloatBetween:(float)low and:(float)high {

    float diff = high - low;
    return (((float) rand() / RAND_MAX) * diff) + low;
}
NSTimer*空间;
-(无效)goToSpace{
[自拍之星];
双寿命;
SKEmitterNode*emitterNode1=[self-starFieldEmitter:[SKColor-lightGrayColor]starspeedify:1 starsPerSecond:1 starScaleFactor:0.08];
寿命=self.frame.size.height*[[UIScreen mainScreen]比例]/1;
[emitterNode1高级模拟时间:生存期];
emitterNode1.zPosition=-10;
[自添加子项:emitterNode1];
SKEmitterNode*emitterNode2=[self-starFieldEmitter:[SKColor-lightGrayColor]starSpeedY:.8 starsPerSecond:.08 starScaleFactor:0.06];
emitterNode2.zPosition=-11;
寿命=自我框架尺寸高度*[[UIScreen mainScreen]比例]/.8;
[emitterNode2高级模拟时间:生存期];
[自添加子项:emitterNode2];
SKEmitterNode*emitterNode3=[self-starFieldEmitter:[SKColor-grayColor]starspeedite:.5 starsPerSecond:.5 starScaleFactor:0.03];
emitterNode3.zPosition=-12;
寿命=自我框架尺寸高度*[[UIScreen mainScreen]比例]/.5;
[emitterNode3高级模拟时间:生存期];
[自添加子项:emitterNode3];

空格=[NSTimer scheduledTimerWithTimeInterval:2目标:自选择器:@selector(shootingStar)userInfo:nil repeats:YES]; } -(SKEmitterNode*)星场发射器:(SKColor*)颜色星速:(CGFloat)星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星速星{ SKEmitterNode*emitterNode=[SKEmitterNode节点]; CGFloat寿命=self.frame.size.height*[[UIScreen mainScreen]scale]/starSpeedY; emitterNode.particleTexture=[SKTexture textureWithImage:[UIImage ImageName:@“stars”]; emitterNode.particleBirthRate=starsPerSecond; emitterNode.particleColor=[SKColor lightGrayColor]; emitterNode.particleSpeed=starSpeedY*-1; emitterNode.particleScale=starScaleFactor; emitterNode.particleColorBlendFactor=1; emitterNode.particleLifetime=寿命; int rndValue=1+arc4random()%(45-1); emitterNode.particleRotation=rnd值; emitterNode.position=CGPointMake(self.frame.size.width/2,self.frame.size.height); emitterNode.particlePositionRange=CGVectorMake(self.frame.size.width,self.frame.size.height); 返回发射极; } -(BOOL)getYesOrNo{ int tmp=(arc4random()%30)+1; 如果(tmp%5==0) 返回YES; 返回否; } -(无效)射击之星{ 布尔左=[self getYesOrNo]; int xPos=0; int height=self.frame.size.height; int yPos=1+arc4random()%(高度-1); 如果(左){ xPos=-50; }否则{ xPos=self.frame.size.width+50; } SKEmitterNode*shootingstar=[SKEmitterNode节点]; shootingstar=[NSKeyedUnarchiver unarchiveObjectWithFile:[[NSBundle mainBundle]pathForResource:@“sks”类型的“spark”; CGPoint xy=CGPointMake(xPos,yPos); shootingstar.position=xy; shootingstar.name=@“shootingstar”; shootingstar.zPosition=-2.0; shootingstar.targetNode=self.scene; [self-addChild:shootingstar]; //设置随机大小以模拟距离 float val=[介于:.1和:.5之间]; SKAction*scale=[SKAction scaleBy:val持续时间:0]; [shootingstar runAction:规模完成:零]; //现在根据大小设置速度(越小=越远=越慢) int-dur=0; 如果(val<.2)dur=5; 如果(val<.35)dur=3,则为其他情况; else-dur=2; int moveY=-500+arc4random()%(500--500); int-moveX; 如果(左){ moveX=500; }否则{ moveX=-500; } SKAction*move=[SKAction-moveByX:moveX-y:moveY-duration:dur]; int waitDuration=2+arc4random()%(5-2); SKAction*wait=[SKAction waitForDuration:waitDuration]; SKAction*序列=[SKAction序列:@[wait,move]]; [shootingstar运行操作:序列完成:^{ [shootingstar从父级移除]; //[自拍之星]; }]; } -(浮动)随机浮动介于:(浮动)低和:(浮动)高之间{ 浮差=高-低; 返回(((浮动)rand()/rand_MAX)*差异)+低; }
我能够通过引用以下几个答案来解决我的问题:


在我的例子中,我用于stars的图像stars.png位于我的项目目录中。我将其移动到Images.xcsets并添加了@2x和@3x版本的图像。这解决了我的问题,尽管我不完全理解原因。

space=[NSTimer scheduledTimerWith…不要将NSTimer与精灵工具包一起使用。请参阅:感谢您提供的提示。现在将其更新为使用SKAction repeat forever