Не могу найти источник, если утечка памяти на любых инструментах - PullRequest
0 голосов
/ 11 марта 2020

Я боролся со всеми инструментами обнаружения утечек памяти, которые я мог найти, и я почти сдался на этом этапе. Все, что я пробовал, говорит мне, что мои утечки прямо из Mallo c, даже когда он отключен. У меня есть код от одного из протекающих контроллеров представления, и скриншот всех отладчиков утечки дает мне, я могу только надеяться, что ответ на один из них исправит их все. Я понятия не имею, что происходит с этим. Изображение Leaks Instruments

import UIKit
import AVKit
var closetTaken = 0
class Closet: UIViewController {
var ClosetItems = [UIImageView]()
var ClosetPans = [UIPanGestureRecognizer]()
var closetItemCount = 0
var localItems: [Object] = []
var indexList: [Int] = []
var hold: Bool = true
@IBOutlet weak var Exit: UIButton!
override func viewDidAppear(_ animated: Bool) {
    if(hold){
    for (i,item) in Items.enumerated(){
        if(item.itemState == "Closet"){
            let localItem = item
            localItems.append(localItem)
            indexList.append(i)
            closetItemCount += 1
        }
    }
    for (i, item) in localItems.enumerated(){
        let image = UIImageView()
        ClosetItems.append(image)
        let pan = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(_:)))
        ClosetPans.append(pan)
        ClosetItems[i].frame = CGRect(x: i*500-closetItemCount*500/3, y: 0, width: 400, height: 400)
        ClosetItems[i].image = item.itemImage
        ClosetItems[i].isUserInteractionEnabled = true
        ClosetItems[i].contentMode = UIView.ContentMode.scaleAspectFit;
        ClosetItems[i].addGestureRecognizer(ClosetPans[i])
        self.view.addSubview(ClosetItems[i])
    }
    let pan = UIPanGestureRecognizer(target: self, action: #selector(self.handlePan(_:)))
    self.view.addGestureRecognizer(pan)

    Exit.layer.zPosition = 1
    SegueImage.layer.zPosition = 2
    }
    hold = true
}
@objc func handlePan(_ recognizer: UIPanGestureRecognizer) {
    guard let recognizerView = recognizer.view else {
        return
    }
    let translation = recognizer.translation(in: view)
    for item in ClosetItems {
        item.center.x += translation.x
    }
    if(recognizerView != self.view){recognizerView.center.y += translation.y}
    recognizer.setTranslation(.zero, in: view)

    for item in ClosetItems {
        if(item.center.x>CGFloat((closetItemCount)*500-closetItemCount*500/3)){
            item.center.x -= CGFloat(closetItemCount*500)
        }
    }

    guard recognizer.state == .ended else{
        return
    }

    let velocity = recognizer.velocity(in: view)
    let vectorToFinalPoint = CGPoint(x: velocity.x/5, y: velocity.y / 5)

    var finalPoint = recognizerView.center
    var finalPointCloset = [CGFloat]()
    for item in ClosetItems {
        finalPointCloset.append(item.center.x)
    }
    for (i,_) in ClosetItems.enumerated() {
        finalPointCloset[i] += vectorToFinalPoint.x
    }
    finalPoint.y += vectorToFinalPoint.y
    let vectorToFinalPointLength = (
    vectorToFinalPoint.x * vectorToFinalPoint.x + vectorToFinalPoint.y * vectorToFinalPoint.y
    ).squareRoot()
    UIView.animate(withDuration: TimeInterval(vectorToFinalPointLength/2500) ,delay: 0, options: .curveEaseOut, animations: {
        var replaceDistance: CGFloat = 20050324
        if(recognizerView != self.view){
            if(finalPoint.y<self.view.frame.height || closetTaken > 11){
                recognizerView.center.y = recognizerView.frame.height/2
            } else {
                recognizerView.center.y = self.view.frame.height+500
                replaceDistance = recognizerView.center.x
                self.closetItemCount -= 1
            }
        }
        self.ClosetItems.enumerated().forEach { i, item in
            if(item.center.x>replaceDistance){
                finalPointCloset[i] -= 500
            }
            item.center.x = finalPointCloset[i]
        }
    }, completion: { (true) in
        for (i,item) in self.ClosetItems.enumerated() {
            if(item.center.x>CGFloat((self.closetItemCount)*500-self.closetItemCount*500/3)){
                item.center.x -= CGFloat(self.closetItemCount*500)
            } else if(item.center.x<CGFloat(-self.closetItemCount*500/3)){
                item.center.x += CGFloat(self.closetItemCount*500)
            }
            if(item.center.y>self.view.frame.height){
                self.ClosetItems[i].removeFromSuperview()
                self.ClosetItems.remove(at: i)
                Items[self.indexList[i]].itemState = "Held"
                self.indexList.remove(at: i)
                closetTaken += 1
            }
        }
    })
}
override var prefersStatusBarHidden: Bool{
    return true
}
@IBOutlet weak var SegueImage: UIImageView!
let animPlayer = AVPlayerViewController()
@IBAction func FromClosetSegue(_ sender: Any) {
    if let path = Bundle.main.path(forResource: "FromCloset", ofType: "avi", inDirectory: "SegueAnimations")
    {
        let SegueAnimation = AVPlayer(url: URL(fileURLWithPath: path))


        animPlayer.player = SegueAnimation
        animPlayer.showsPlaybackControls = false
        animPlayer.videoGravity = AVLayerVideoGravity.resizeAspectFill
         NotificationCenter.default.addObserver(self, selector: #selector(self.finishVideo), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: nil)

        present(animPlayer, animated: false, completion:
    {
            SegueAnimation.play()
    })
    }

}
@objc func finishVideo()
{
    hold = false

    SegueImage.isHidden = false

    animPlayer.dismiss(animated: false)

    NotificationCenter.default.removeObserver(self)

    self.performSegue(withIdentifier: "FromClosetSegue", sender: self)

}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...