gpt4 book ai didi

ios - UITable 的内存问题

转载 作者:行者123 更新时间:2023-11-29 00:57:22 29 4
gpt4 key购买 nike

我的应用程序因内存问题(使用太多内存)而崩溃。当我从 TableView 打开足够多的对象时,就会发生这种情况。我已经在互联网上搜索了这个问题,我可以看出这可能是因为内存从未被释放过。但我该如何释放它呢?

这是我的代码。

TableExerciseViewController

class TableExercisesViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

var choosenCellIndex = 0
var filteredExercises = [Exercise]()

let searchController = UISearchController(searchResultsController: nil)

@IBOutlet weak var searchBar: UISearchBar!

@IBOutlet weak var tableView: UITableView!

override func viewDidLoad() {
super.viewDidLoad()

searchController.searchResultsUpdater = self
searchController.dimsBackgroundDuringPresentation = false

searchController.searchBar.placeholder = "Look up an exercise..."

definesPresentationContext = true
tableView.tableHeaderView = searchController.searchBar
}

override func viewDidAppear(animated: Bool) {
if let row = tableView.indexPathForSelectedRow {
self.tableView.deselectRowAtIndexPath(row, animated: false)
}
}


override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}




func filterContentForSearchText(searchText: String, scope: String = "All") {
filteredExercises = ExerciseManager.sharedInstance.getExercises().filter {
exercise in return exercise.name.lowercaseString.containsString(searchText.lowercaseString)
}

tableView.reloadData()
}


//Returns the size of the arraylist
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {


if searchController.active && searchController.searchBar.text != "" {
return filteredExercises.count
}
return ExerciseManager.sharedInstance.getExercises().count
}

//Returns the selected Cell
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCellWithIdentifier("Exercise Cell", forIndexPath: indexPath) as! ExerciseCustomCell
let exercise: Exercise
if searchController.active && searchController.searchBar.text != "" {
exercise = filteredExercises[indexPath.row]
} else {
exercise = ExerciseManager.sharedInstance.getExercises()[indexPath.row]
}

cell.imgExercise?.image = exercise.exerciseImage1
cell.lblExerciseName?.text = exercise.name
cell.lblExerciseMuscleGroup?.text = exercise.muscle
cell.lblExerciseTools?.text = "Equipment: \(exercise.tool)"

return cell
}

func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}


//Sends the data through the selected identifier
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

choosenCellIndex = indexPath.row

// Start segue with index of cell clicked
self.performSegueWithIdentifier("Show Exercise", sender: self)

}

//Prepares the data for the segue and the next viewcontroller
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

// get a reference to the second view controller
let exerciseViewController = segue.destinationViewController as! ExerciseViewController

// set a variable in the second view controller with the data to pass
if searchController.active && searchController.searchBar.text != "" {
exerciseViewController.exercise = filteredExercises[choosenCellIndex]
} else {
exerciseViewController.exercise = ExerciseManager.sharedInstance.getExercises()[choosenCellIndex]
}

}

deinit {
debugPrint("TableExerciseView deinitialized...")
}

}

extension TableExercisesViewController: UISearchResultsUpdating {
func updateSearchResultsForSearchController(searchController: UISearchController) {
filterContentForSearchText(searchController.searchBar.text!)
}

练习 View Controller

class ExerciseViewController: UIViewController {
weak var exercise: Exercise?
var receivedCellIndex = 0

@IBOutlet weak var scrollView: UIScrollView!

@IBOutlet weak var lblExerciseName: UILabel!

@IBOutlet weak var lblExerciseMuscleGroup: UILabel!

@IBOutlet weak var lblStartDescription: UILabel!

@IBOutlet weak var lblLastDescription: UILabel!


@IBOutlet weak var imgExerciseAnimation: UIImageView!

@IBOutlet weak var imgExerciseStartPosition: UIImageView!

@IBOutlet weak var imgExerciseLastPosition: UIImageView!

var timer = NSTimer()
var counter = 1


override func viewDidLoad() {
super.viewDidLoad()

//Sets the color of the back button in navigation bar
self.navigationController!.navigationBar.tintColor = UIColor.whiteColor();

//Sets the labels
lblExerciseName.text = exercise?.name
lblExerciseMuscleGroup.text = exercise!.muscle
lblStartDescription.text = "1. \(exercise!.startDescription)"
lblLastDescription.text = "2. \(exercise!.lastDescription)"


//Sets the antimation and the images
imgExerciseAnimation.image = exercise?.exerciseImage1
imgExerciseStartPosition.image = exercise?.exerciseImage1
imgExerciseLastPosition.image = exercise?.exerciseImage2

//Timer
self.timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: #selector(ExerciseViewController.demonstrateExercise), userInfo: nil, repeats: true)

}

override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
self.timer.invalidate()
}

func demonstrateExercise() {
if counter == 1 {
imgExerciseAnimation.image = exercise?.exerciseImage2
counter += 1
} else {
counter = 1
imgExerciseAnimation.image = exercise?.exerciseImage1
}
}
}

最佳答案

我猜测占用内存的是您的ExerciseViewController 中的锻炼图像。由于 Swift 使用 ARC为了管理内存,您需要删除对这些图像的引用(并进行相关练习),以便系统可以从内存中释放它们。

override func viewDidDisappear(animated: Bool) {
lblExerciseName.text = nil
lblExerciseMuscleGroup.text = nil
lblStartDescription.text = nil
lblLastDescription.text = nil

imgExerciseAnimation.image = nil
imgExerciseStartPosition.image = nil
imgExerciseLastPosition.image = nil
}

由于您的 exercice 变量是,并且没有任何内容引用它,系统现在将从内存中释放它,而不是在用户每次访问新的ExerciseViewController 时构建多个练习副本。

关于ios - UITable 的内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37496981/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com