Я боролся со всеми инструментами обнаружения утечек памяти, которые я мог найти, и я почти сдался на этом этапе. Все, что я пробовал, говорит мне, что мои утечки прямо из 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)
}
}