iOS 8中的SKSpriteNode池似乎被分配给重叠内存

时间:2014-09-09 22:14:42

标签: objective-c cocoa-touch ios8 nsset skspritenode

我可能会遗漏一些东西。但我在appstore上的当前应用程序适用于iOS 7,但在iOS 8中完全失败,因为它无法创建预分配的精灵池。除非精灵具有特别不同的属性,否则它们似乎写入相同的地址。

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

  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男男性接触者[383:27490] aSet数量:1

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

1 个答案:

答案 0 :(得分:5)

感谢Josh关于如何解决这条新路的方向。

我将SKSpriteNode子类化,重写-isEqual和-hash,这两者都是我对NSObject实现的最佳猜测。然后在我的子类名称中为“SKSpriteNode”执行了“查找/替换全部”,并且所有内容都返回到iOS 7版本中:

-(BOOL)isEqual:(id)object{

    return self == object;
}

- (NSUInteger)hash
{
    return (NSUInteger)self;
}