Ios I';我在使用UIDynamication以及创建和删除项目时遇到性能问题

Ios I';我在使用UIDynamication以及创建和删除项目时遇到性能问题,ios,iphone,swift,uidynamicbehavior,uidynamicanimator,Ios,Iphone,Swift,Uidynamicbehavior,Uidynamicanimator,我制作了一个基于UIDynamicBehavior的应用程序。这是一个游戏,你在屏幕中间有一个圆圈,有球从中间向外圆(当他们击中它消失),在这个“发射”之间的间隔越来越短(这不会引起问题,你稍后会看到)。好吧,问题是在大约100圈之后,一切都变得非常滞后,每次“启动”都会使整个游戏冻结片刻,直到问题变得如此严重,整个游戏都冻结了 问题似乎是我没有正确地删除球。即使时间间隔不变,同时出现在屏幕上的球数始终不变(3-4),问题仍然会发生 这也不是内存问题,因为内存使用量保持在20MB左右,但处理器从

我制作了一个基于
UIDynamicBehavior
的应用程序。这是一个游戏,你在屏幕中间有一个圆圈,有球从中间向外圆(当他们击中它消失),在这个“发射”之间的间隔越来越短(这不会引起问题,你稍后会看到)。好吧,问题是在大约100圈之后,一切都变得非常滞后,每次“启动”都会使整个游戏冻结片刻,直到问题变得如此严重,整个游戏都冻结了

问题似乎是我没有正确地删除球。即使时间间隔不变,同时出现在屏幕上的球数始终不变(3-4),问题仍然会发生

这也不是内存问题,因为内存使用量保持在20MB左右,但处理器从一开始的0%开始,它一直在上升,直到达到100%,整个过程就停止了

因此,当我创建一个球时,这里的所有代码如下:

func lunchMyBall(timer: NSTimer!){
    let myBall = createBall()
    var angle = Int(arc4random_uniform(70))
    angle = angle+1-35
    if angle < 0 {
        angle = -angle
        angle = angle-70
    } else {
        angle = angle+70
    }
    if arc4random()%2 == 1 {
        angle = -angle
    }
    print("angle: \(angle)")
    if lastBallAngle == nil {
        myBall.angle = Double(angle)
    }else{
        switch lastBallColorIndex! {
        case 1: switch myBall.colorIndex {
            case 1: myBall.angle = lastBallAngle! + Double(angle)
            case 2: myBall.angle = lastBallAngle! + Double(angle)-90
            case 3: myBall.angle = lastBallAngle! + Double(angle)+180
            case 4: myBall.angle = lastBallAngle! + Double(angle)+90
        default: break
            }
        case 2: switch myBall.colorIndex {
            case 1: myBall.angle = lastBallAngle! + Double(angle)+90
            case 2: myBall.angle = lastBallAngle! + Double(angle)
            case 3: myBall.angle = lastBallAngle! + Double(angle)-90
            case 4: myBall.angle = lastBallAngle! + Double(angle)+180
            default: break
            }
        case 3: switch myBall.colorIndex {
            case 1: myBall.angle = lastBallAngle! + Double(angle)+180
            case 2: myBall.angle = lastBallAngle! + Double(angle)+90
            case 3: myBall.angle = lastBallAngle! + Double(angle)
            case 4: myBall.angle = lastBallAngle! + Double(angle)-90
            default: break
            }
        case 4: switch myBall.colorIndex {
            case 1: myBall.angle = lastBallAngle! + Double(angle)-90
            case 2: myBall.angle = lastBallAngle! + Double(angle)+180
            case 3: myBall.angle = lastBallAngle! + Double(angle)+90
            case 4: myBall.angle = lastBallAngle! + Double(angle)
            default: break
            }
        default: break
        }
    }
    if myBall.angle! > 360 {
        myBall.angle = myBall.angle! - 360
    }else if myBall.angle! < 0 {
        myBall.angle = myBall.angle! + 360
    }
    let tempAngle = CGFloat((myBall.angle!/360)*2*M_PI)
    lastBallAngle = myBall.angle
    lastBallColorIndex = myBall.colorIndex
    dataSource?.lunchMyBall(myBall, angle: tempAngle)
    let timer = NSTimer.scheduledTimerWithTimeInterval(Double(difficulty), target: self, selector: "lunchMyBall:", userInfo: nil, repeats: false)
    timer.tolerance = 0.01
}

func createBall() -> UIItemView {
    var frame = CGRect(origin: CGPointZero, size: CGSize(width: 10, height: 10))
    frame.origin = (CGPoint(x: (dataSource?.getCircleCenter().x)!-5, y: (dataSource?.getCircleCenter().y)!-5))

    let ballView = UIItemView(frame: frame, color: UIColor.random())

    return ballView
}
我就是这样删除它的:

func collisionBehavior(behavior: UICollisionBehavior, beganContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, atPoint p: CGPoint) {
    print("did")
    if let myItem = item as? UIItemView {
        if (isPointInAngle(myItem.angle!, colorIndex: myItem.colorIndex) == true) {
            dataSource?.scoreChanged(true)
            print("true")
        }else{
            dataSource?.scoreChanged(false)
            print("false")
        }

        collisionBehavior.removeItem(myItem)
        removeChildBehavior(myItem.pushBehavior!)
        myItem.pushBehavior?.removeItem(myItem)
        myItem.removeFromSuperview()
    }
}
这是设置为在与另一个圆发生碰撞时触发的

很抱歉,代码太多了,但我真的无法找出问题出在哪里,所以我很难确定问题出在哪里

我已经在这个问题上工作了两天多了,但仍然不能解决它。我尝试了一切,重用行为(而不是删除它,我制作了一个数组,这样下一个球就可以从那里开始,并设置一个新的角度),多线程(我不是很有经验),我还查看了时间分析器,但对我来说没有任何意义,因为我是一个初学者。我真的很感激有人知道他在做什么,他可以只看一眼,检查并发现任何问题,因为我认为对于一个有经验的程序员来说,问题应该是显而易见的。如果有帮助的话,这里是答案。所以你可以看到我有两件事,我认为是重要的。我有一个
UIDynamicBehavior
的子类,我在其中设置了我的所有行为,还有一个基本的swift类“BallLauncher”,它应该是导致球发射的原因,因此也可能存在问题

func collisionBehavior(behavior: UICollisionBehavior, beganContactForItem item: UIDynamicItem, withBoundaryIdentifier identifier: NSCopying?, atPoint p: CGPoint) {
    print("did")
    if let myItem = item as? UIItemView {
        if (isPointInAngle(myItem.angle!, colorIndex: myItem.colorIndex) == true) {
            dataSource?.scoreChanged(true)
            print("true")
        }else{
            dataSource?.scoreChanged(false)
            print("false")
        }

        collisionBehavior.removeItem(myItem)
        removeChildBehavior(myItem.pushBehavior!)
        myItem.pushBehavior?.removeItem(myItem)
        myItem.removeFromSuperview()
    }
}