2016-07-03 11 views
1

Ich habe ein ios/swift-Projekt, in dem ich viele UIImageViews in einem Scrollview platziere. Ich habe mehrere scrollviews und ich möchte sicherstellen, dass alle Speicher freigegeben wird, wenn ich einen schließe. Bisher scheint es, als ob ich ein UIImage hinzufügen würde, es erhält 16 Referenzen mit dem folgenden Code. Wenn ich es auf einem Gerät ausfühle, hat es nicht genügend Arbeitsspeicher und stürzt ab.swift: ARC: wie man alle Verweise auf ein UII-Objekt freigibt

import UIKit 

class ViewController: UIViewController 
{ 

    var scrollView: UIScrollView? 
    var backgroundView:UIImageView? 
    var background:UIImage? 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 
     for i in 1 ..< 10000 
     { 
      print(i) 
      scrollView = UIScrollView(frame: CGRect(x: 0, y: 0, width: 1000, height: 1000)) 
      view.addSubview(scrollView!) 

      if let backgroundPath = NSBundle.mainBundle().pathForResource("1", ofType: "jpg") 
      { 
       background = UIImage(contentsOfFile: backgroundPath)! 
      } 

      backgroundView = UIImageView(image: background) 

      backgroundView?.frame = CGRect(x: 100, y: 500, width: 500, height: 500) 
      scrollView?.addSubview(backgroundView!) 

      print(CFGetRetainCount(background!)) 
      print(CFGetRetainCount(backgroundView!)) 
      print(CFGetRetainCount(scrollView!)) 

      scrollView!.contentSize = CGSize(width: 500, height: view.frame.height) 

      backgroundView = nil 
      scrollView = nil 
      background = nil 
     } 
    } 
} 

Wie bekomme ich einen Referenzzähler von Null, um den Speicher freizugeben? Vielen Dank!

Antwort

0

Nur 16 Referenzen? Dieser Code erstellt 9.999 Bildlaufansichten (jedes Mal, wobei das vorherige Bild in der Ansichtshierarchie verbleibt, Ihre Referenz jedoch bei der nächsten Iteration nicht mehr verwendet wird), jeweils mit einer eigenen Kopie von 1.jpg und jeweils als Unteransicht von view hinzugefügt. In Bezug auf die Freigabe des Speichers sollten Sie alle starken Referenzen, die Sie haben, entfernen sowie alle anderen Referenzen entfernen, z. B. die Ansichtshierarchie.

Also, wenn Sie die Verweise auf die Bilder entfernen möchten, können Sie entweder setzen Sie die image Eigenschaft des UIImageView und/oder die UIImageView (oder die UIScrollView) aus der Sicht Hierarchie entfernen.

Hinweis, Ihre Versuche zu setzen backgroundView und scrollView-nil Ihren starken Bezug auf diejenigen entfernen, aber addSubview früher genannt, so die Ansicht Hierarchie hat noch einen starken Bezug zu ihnen. Wenn Sie alles loswerden möchten, bevor Sie scrollView auf nil setzen, stellen Sie sicher, dass Sie scrollView.removeFromSuperview() aufrufen, um es aus der Ansichtshierarchie zu entfernen.

+0

ich meine 16 Referenzen pro UIImage. Ich hatte den Eindruck, dass das Setzen von UIImageView, Scrollview und UIImage auf null ihre Referenzen löschte, aber das scheint nicht zu passieren. Ich werde versuchen, sie vollständig aus der Ansicht zu entfernen. – timfi

+0

Wenn Sie diese Werte auf "nil" setzen, entfernen Sie Ihre starken Verweise darauf. Wenn Sie jedoch "addSubview" aufgerufen haben, haben Sie sie zur Ansichtshierarchie hinzugefügt, die ihre eigenen starken Referenzen enthält. Sie müssen 'removeFromSuperview' entfernen, um es aus der Ansichtshierarchie zu entfernen und die letzten verbleibenden starken Referenzen aufzulösen. – Rob

+0

danke, es dauerte eine Weile, um in meinem eigentlichen Projekt zu implementieren, aber meine Probleme sind vorbei! Gewicht meiner Schultern, enge Frist :) – timfi