iOS8中的SKSpriteNode池似乎被分配给了重叠的内存



我可能缺少一些东西。但我目前在应用商店上的应用程序在iOS 7中运行,但在iOS 8中完全失败,因为它不会创建预先分配的精灵池。除非精灵具有特别不同的属性,否则它们似乎被写入同一地址。

在iOS7中,以下代码生成一个包含4个唯一对象的集合。在iOS8中,相同的代码生成一个只有1个对象的集合:

  NSMutableSet *aSet = [NSMutableSet set];
  SKColor *sameColor = [SKColor redColor];
  CGSize sameSize = CGSizeMake(10, 10);
  for (int i = 0; i < 4; i++) {
      //allocate a brand new sprite
      SKSpriteNode *thisSprite1 = [[SKSpriteNode alloc] initWithColor:sameColor size:sameSize];
      [aSet addObject:thisSprite1];
  }
NSLog(@"aSet Count: %i", aSet.count);

iOS8结果:

2014-09-09 15:06:43.065 MSM[383:27490]aSet计数:1

我疯了吗?令人惊讶的是,我的整个应用程序几乎都是基于这个反复重复的代码概念。如果我做了同样的事情,但使用了类似NSObject的东西,那么问题就消失了,所以它似乎是对SKSprite的新更改。我知道我可以用一些疯狂的东西来解决它,但这是一个巨大的痛苦,因为我不应该这样做,我希望避免再次提交版本。

感谢Josh指导如何解决道路上的新颠簸。

我对SKSpriteNode进行了子类化,覆盖-isEqual和-hash,这两个选项都是我对NSObject实现的最佳猜测。然后,我只是在项目中为我的子类名称"SKSpriteNode"做了一个Find/ReplaceAll,一切都回到了iOS 7版本中:

-(BOOL)isEqual:(id)object{
    return self == object;
}
- (NSUInteger)hash
{
    return (NSUInteger)self;
}

最新更新