首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SKNode.removeFromParent() EXC_BAD_ACCESS

SKNode.removeFromParent() EXC_BAD_ACCESS
EN

Stack Overflow用户
提问于 2014-08-20 14:07:42
回答 2查看 1.2K关注 0票数 3

在我的Swift项目中,我注意到了一种奇怪的行为,并将其复制到一个空的SpriteKit项目上:

代码语言:javascript
复制
class GameScene: SKScene {
    override func didMoveToView(view: SKView) {

        let sprite = SKSpriteNode(imageNamed:"Spaceship")
        self.addChild(sprite)
        //sprite.removeFromParent()

        let sprite2 = SKSpriteNode(imageNamed:"Spaceship")
        self.addChild(sprite2)
        sprite2.removeFromParent()
    }
}

它在应用程序启动之前就崩溃了,我所能看到的就是:

我的配置是xCode6-Beta 6,iPad Mini Retina和OS8-Beta5和OSX10.9.4。我还在模拟器中复制了bug;使用xCode6-Beta5;并在touchesBegan方法中移动代码。

取消对行sprite.removeFromParent()的注释,使bug消失。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-21 13:56:44

的重要性:这个错误已经从iOS 8.1中纠正了,请确保更新并使您的应用程序无法使用iOS 8.0和更早版本。

我发现发生了什么..。而且应该是一些苹果雇员犯了一个错误。解释:

代码语言:javascript
复制
let sprite = SKSpriteNode(imageNamed:"Spaceship")
self.addChild(sprite)

let sprite2 = SKSpriteNode(imageNamed:"Spaceship")
self.addChild(sprite2)
sprite2.removeFromParent()

println( sprite == sprite2 ) // Returns "true"
// Then crash

如果你这么做:

代码语言:javascript
复制
let sprite = SKSpriteNode(imageNamed:"Spaceship")
sprite.name = "1"
self.addChild(sprite)

let sprite2 = SKSpriteNode(imageNamed:"Spaceship")
sprite2.name = "2"
self.addChild(sprite2)
sprite2.removeFromParent()

println( sprite == sprite2 ) // Returns "false"
// Then all is right, no crash

我认为很简单,当您调用.removeFromParent()时,苹果的代码检查是否与==在代码中相等,就像他们在Objective中所做的那样。但是由于它是Swift,所以您应该使用===来检查对象等式而不是==,所以这是一个愚蠢的错误。

祝贺您在SpriteKit代码中发现了一个错误,去苹果公司填一张表格 :D

票数 6
EN

Stack Overflow用户

发布于 2014-09-11 10:35:51

只有当SKNode具有相同的名称和相同的类时,才会发生这种情况。设置为SKNode唯一名称。

我的代码:-(空) removeItemWithIdentifier:(FoodsIdentifiers)标识符{

代码语言:javascript
复制
NSArray *items = [foodItemHolderNode children];
int count = (int)[items count];
for (int i = 0; i < count; i++) {
    FoodItemObject *foodItem = [items objectAtIndex:i];
    int itemID = [[foodItem.objectDictionary objectForKey:FOODITEM_IDENTIFIER_KEY] intValue];

    if (itemID == identifier) {
        [foodItem removeFromParent];
        break;
    }

}

// NSString *name = [NSString stringWithFormat:@"ID%i", (int)identifier];
//SKNode *item = [foodItemHolderNode childNodeWithName:name];
//[item removeFromParent];

警告从同名错误父母处删除

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25406872

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档