2016-05-28 7 views
0

メモリの問題(使用されているメモリが多すぎます)のため、アプリケーションがクラッシュしています。これは、私がTableViewからオブジェクトを十分に開いたときに発生します。私はインターネットでこの問題を調査しましたが、メモリが解放されていないためにこの問題が発生する可能性があります。しかし、私はそれをどのように解放するのですか?メモリの問題からUITable

ここに私のコードです。 ExerciseViewController

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 
    } 
} 
} 
+0

あなたはdidSelectRowイベントを意味するオブジェクトを開いていますか? – Alok

+0

はい、それはセグを通過します。 @Alok – Grumme

+0

各画像の大きさはどれくらいですか? – Xcoder

答えて

1

私はメモリを占有しているもの、あなたのExerciseViewControllerにおける運動イメージがあることを推測している

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!) 
} 

TableExerciseViewController。 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変数がweakあり、そして何もシステムが今の代わりエキソサイズの複数のコピーを持つのメモリから、それを無料ユーザーが新しいExerciseViewControllerを訪問するたびに構築し、それを参照していないので。

+0

こんにちは@JeremyRea。 ViewDidDisappear関数を更新しても問題は解決しません。他に提案やアイデアはありますか? – Grumme

+0

@Jakob 'exercise = nil'を追加しても何も変わりませんか? –

0

deinit関数をオーバーライドし、Exerciseビューを終了するときに呼び出されるかどうかを確認します。そうでなければ、私はviewWillDisappearまたはDid関数でタイマーを破壊します。

+0

エクササイズビューを終了するたびに、deinit関数が呼び出されます。 – Grumme

+0

私はタイマーの有無にかかわらずテストしましたが、それでも問題は解決しません。 今私viewDidDisappear機能は次のように探しています: 'super.viewWillDisappear(アニメーション) lblExerciseName.text = nilの lblExerciseMuscleGroup.text = nilの lblStartDescription.text = nilの lblLastDescription.text = nilの imgExerciseAnimation.image = nil imgExerciseStartPosition.image = nil imgExerciseLastPosition.image = nil self.timer.invalidate() ' – Grumme