我可能缺少一些东西。但我目前在应用商店上的应用程序在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;
}