Ios NSGenericeException原因收集<;N混凝土可接受:xxx>;

Ios NSGenericeException原因收集<;N混凝土可接受:xxx>;,ios,objective-c,sprite-kit,Ios,Objective C,Sprite Kit,这是我在出现时看到的错误SKScene,此错误随机发生,无法复制 *由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“*集合在枚举时发生了变异。” 发生了什么事 如果你需要任何其他信息,请告诉我 谢谢 编辑: *** First throw call stack: ( 0 CoreFoundation 0x025601e4 __exceptionPreprocess + 180 1 libobjc.

这是我在出现时看到的错误
SKScene
,此错误随机发生,无法复制

*由于未捕获的异常“NSGenericeException”而终止应用程序,原因:“*集合在枚举时发生了变异。”

发生了什么事

如果你需要任何其他信息,请告诉我

谢谢

编辑:

*** First throw call stack:
(
    0   CoreFoundation                      0x025601e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x022298e5 objc_exception_throw + 44
    2   CoreFoundation                      0x025efcf5 __NSFastEnumerationMutationHandler + 165
    3   Foundation                          0x01e47f03 -[NSConcreteMapTable countByEnumeratingWithState:objects:count:] + 66
    4   CoreFoundation                      0x0253d77f -[__NSFastEnumerationEnumerator nextObject] + 143
    5   SpriteKit                           0x01d009f2 +[SKTextureAtlas(Internal) findTextureNamed:] + 232
    6   SpriteKit                           0x01cf709c __26-[SKTexture loadImageData]_block_invoke + 1982
    7   SpriteKit                           0x01d34d09 _Z14SKSpinLockSyncPiU13block_pointerFvvE + 40
    8   SpriteKit                           0x01cf6898 -[SKTexture loadImageData] + 228
    9   SpriteKit                           0x01cf65d9 __51+[SKTexture preloadTextures:withCompletionHandler:]_block_invoke + 241
    10  libdispatch.dylib                   0x02b117b8 _dispatch_call_block_and_release + 15
    11  libdispatch.dylib                   0x02b264d0 _dispatch_client_callout + 14
    12  libdispatch.dylib                   0x02b14eb7 _dispatch_root_queue_drain + 291
    13  libdispatch.dylib                   0x02b15127 _dispatch_worker_thread2 + 39
    14  libsystem_c.dylib                   0x02de1e72 _pthread_wqthread + 441
    15  libsystem_c.dylib                   0x02dc9daa start_wqthread + 30
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我有时也会遇到同样的例外。它已经存在了一段时间,我已经试着找出它几个星期了

我的怀疑是,这可能是由于预加载纹理造成的,无论是手动还是由Sprite Kit自动触发,同时一些其他代码导致加载或访问纹理

我已经减少了我的预处理次数:只调用一次,但我仍然遇到问题,只是次数减少了。每当我运行从completionBlock或其他在不同线程上运行的代码中访问或加载图像(或可能是在内部)的选择器时,我都尝试执行selector:onMainThread:

在我将用户界面代码移动到主线程(它是从完成处理程序调用的)之后,我今天一整天都没有发生这种崩溃。但我不能100%肯定这是否解决了问题


我希望这有点帮助。肯定有一些事情很棘手,如果您执行
po 0x1459da60
(在lldb的命令窗口中,使用异常提供的地址),您将看到正在修改的是SKTextureAtlas纹理列表。我希望这有助于您确定问题的根源。

我在尝试预加载两个简单动画时也遇到了同样的问题。我尝试将动画预加载到字典中,并准备好通过字符串键调用它们。这是我试过的

-(void)setupAnimDict {
    animDict = [[NSMutableDictionary alloc] init];

    [animDict setObject:[self animForName:@"blaze" frames:4] forKey:@"blaze"];
    [animDict setObject:[self animForName:@"flame" frames:4] forKey:@"flame"];
}

-(SKAction *)animForName:(NSString *)name frames:(int)frames {
    NSArray *animationFrames = [self setupAnimationFrames:name base:name num:frames];
    SKAction *animationAction = [SKAction animateWithTextures:animationFrames     timePerFrame:0.10 resize:YES restore:NO];
    return [SKAction repeatActionForever:animationAction];
}

-(NSArray *)setupAnimationFrames:(NSString *)atlasName base:(NSString *)baseFileName num:(int)numberOfFrames {

    [self preload:baseFileName num:numberOfFrames];

    NSMutableArray *frames = [NSMutableArray arrayWithCapacity:numberOfFrames];
    SKTextureAtlas *atlas = [SKTextureAtlas atlasNamed:atlasName];
    for (int i = 0; i < numberOfFrames; i++) {
        NSString *fileName = [NSString stringWithFormat:@"%@%01d.png", baseFileName, i];
        [frames addObject:[atlas textureNamed:fileName]];
    }

    return frames;
}

-(void)preload:(NSString *)baseFileName num:(int)numberOfFrames {

    NSMutableArray *frames = [NSMutableArray arrayWithCapacity:numberOfFrames];

    for (int i = 0; i < numberOfFrames; i++) {
        NSString *fileName = [NSString stringWithFormat:@"%@%01d.png", baseFileName, i];
        [frames addObject:[SKTexture textureWithImageNamed:fileName]];
    }

    [SKTexture preloadTextures:frames withCompletionHandler:^(void){}];
}

因此,第一次预加载是在我尝试预加载另一个之前完成的


我不知道这是否是你的问题,但如果是,请告诉我们

据我所知,sprite kit方法中存在一个sprite kit错误:

preloadTextures: withCompletionHandler:
我能够解决这个问题的唯一方法是完全删除这个方法。 根据apple文档,如果访问
size
属性,纹理也会被加载。 所以我的解决方法就是要做到这一点:

for (SKTexture *texture in self.texturesArray) {
    texture.size;
}

虽然不漂亮,但它很管用

在Xcode 6.3 beta/Swift 1.2中,同样的事情仍在发生。这是一个暂时的解决办法,对我来说很有效

SKTextureAtlas.preloadTextureAtlases([SKTextureAtlas(named: "testAtlas")], withCompletionHandler: {
    dispatch_async(dispatch_get_main_queue(), {
        handler()
    })
})

实际上,我将其包装在一个函数中,以便所有预加载都通过它。这样,如果它在SpriteKit端得到修复,或者如果这种方法存在重大缺陷,我可以删除调度。

答案很好!非常感谢,因此您建议使用:[self-performSelectorOnMainThread..]从initWithSize调用用户界面代码,对吗。。。不仅仅是[self-aMethod],它更像是一种观察和预感,但一般来说,如果您怀疑某些代码与纹理加载(发生在后台)并行运行,那么在主线程上或在调用纹理预加载完成处理程序后,尝试运行该特定代码可能是值得的。我仍然无法100%确定我的问题是否已修复,或者由于问题如此零星,究竟是什么原因修复了它。我确实在后台加载了纹理,其余的加载到主线程上,但没有任何更改:(现在我正试图从initWithSize只加载纹理,加载纹理后我调用加载UI的方法…但仍然不知道它是否会工作。除了我设法消除错误之外,我不能说有多少。问题的一部分是在CompletionHandler或其他回调块中堆积代码,因为它们可能在单独的thr上运行ead。如果有一个单独的加载场景,可以保证在预加载纹理时没有其他代码在运行,这也会有所帮助。感谢您的回答,我正在尝试解决这个问题,在initWithSize中加载SKTextureAtlas,并且在所有纹理都来自这个纹理数组之后,不预加载任何内容。这在没有崩溃和所有spr的情况下运行良好你看得对。但我不确定这是正确的方法。它至少解决了你的问题吗?或者你最终找到了另一个解决方案吗?这实际上对我也很有效。我只是做了NSLog(@“%f”,texture.size.width);以避免未使用的变量警告。
for (SKTexture *texture in self.texturesArray) {
    texture.size;
}
SKTextureAtlas.preloadTextureAtlases([SKTextureAtlas(named: "testAtlas")], withCompletionHandler: {
    dispatch_async(dispatch_get_main_queue(), {
        handler()
    })
})