快速使用UIBezierPath进行内存泄漏

时间:2020-07-07 23:37:19

标签: swift memory-leaks uibezierpath

我正在开发一个在窗口中绘制波形的应用程序,该窗口可在主视图中滑动和滑动。我发现,如果我多次打开滑动视图,应用程序就会开始变慢。我发现使用UIBezierPath绘制波形会使我的应用变慢。我想知道是否需要做一些事情来终止当前的UIBezierPath并避免内存泄漏。感谢我对使用UIBezierPath不太熟悉的任何建议。在此先感谢您的帮助!

import UIKit

class WaveView: UIView {
    enum WaveType{
        case sin
        case triangle
        case square
        case noise
        case sawtooth
    }
    var waveType: WaveType = .sin { didSet { setNeedsDisplay() } }
    var color = UIColor.black { didSet { setNeedsDisplay() } }
    let path = UIBezierPath()
    
    var isSelected = false {
        didSet {
            let tempColor: UIColor = self.backgroundColor!
            self.backgroundColor = color
            color = tempColor
        }
    }
    
    private var labelColor: UIColor = #colorLiteral(red: 0, green: 0, blue: 0, alpha: 1)

    override func draw(_ rect: CGRect) {
        let middle: CGPoint = CGPoint(x: rect.midX, y: rect.midY)
        let width = rect.width
        let height = rect.height
        let graphWidth: CGFloat = 0.6
        let amplitude: CGFloat = 0.2
        let midOrigin = CGPoint(x: width * (1 - graphWidth) / 2, y: height * 0.50)
        
        switch waveType {
        case .sin:
            path.move(to: midOrigin)
            for angle in stride(from: 5.0, through: 360.0, by: 5.0) {
                let x = midOrigin.x + CGFloat(angle/360.0) * width * graphWidth
                let y = midOrigin.y - CGFloat(sin(angle/180.0 * Double.pi)) * height * amplitude
                path.addLine(to: CGPoint(x: x, y: y))
            }
        case .triangle:
            let d = rect.width * 0.2
            path.move(to: CGPoint(x: middle.x, y: middle.y - d))
            path.addLine(to: CGPoint(x: middle.x + d, y: middle.y + d))
            path.move(to: CGPoint(x: middle.x, y: middle.y - d))
            path.addLine(to: CGPoint(x: middle.x - d, y: middle.y + d))
        case .square:
            let d = rect.width * 0.2
            path.move(to: CGPoint(x: middle.x - d, y: middle.y + d))
            path.addLine(to: CGPoint(x: middle.x - d/3, y: middle.y + d))
            path.addLine(to: CGPoint(x: middle.x - d/3, y: middle.y - d))
            path.addLine(to: CGPoint(x: middle.x + d/3, y: middle.y - d))
            path.addLine(to: CGPoint(x: middle.x + d/3, y: middle.y + d))
            path.addLine(to: CGPoint(x: middle.x + d, y: middle.y + d))
        case.sawtooth:
            let d = rect.width * 0.2
            path.move(to: CGPoint(x: middle.x - d, y: middle.y + d))
            path.addLine(to: CGPoint(x: middle.x + d, y: middle.y - d))
            path.addLine(to: CGPoint(x: middle.x + d, y: middle.y + d))
        case .noise:
            path.move(to: midOrigin)
            for angle in stride(from: 3.0, through: 360.0, by: 3.0) {
                let x = midOrigin.x + CGFloat(angle/360.0) * width * graphWidth
                let y = midOrigin.y - CGFloat(Float.random(in: -1..<1)) * height * amplitude
                path.addLine(to: CGPoint(x: x, y: y))
            }
        }
        
        color.setStroke()
        path.lineCapStyle = .round
        path.stroke()
    }
}

1 个答案:

答案 0 :(得分:0)

不要将路径实例设为类成员变量-只需在draw()方法中声明本地UIBezierPath变量即可。

class App extends Component {
  constructor(props) {
    super(props);
    
    this.state = {
      bootcampName: "Nucamp"
    };
  }
      render() {
        return (
            <div className="App">
            <Welcome  {this.state.bootcampName}>;
            </div>
        );
    };
}
  
function Welcome(props) {
    return (
      <h1>Welcome to {this.props.bootcampName}!</h1>
    );
  }
}


ReactDOM.render(<App />, document.getElementById('root'));

这将确保释放用于一次draw()调用的路径指令和数据。