内存管理(上)

2016-07-15  本文已影响0人  霏誠拜咬o

内存管理

class FileStream{
  init(){
    print("open file...")
  }    
  func process(){
    print("process file...")
  }
  deinit{
    print("close file...")
  }
}
class MyClass1{
  var stream:FileStream?
}
class MyClass2{
  static var stream:FileStream?
}
var fs1:FileStream() // r(1)

var mc:MyClass1?
mc!.stream=fs1 // r(2)

MyClass2.stream=fs1 // r(3)

fs1?.process()

fs1=nil //r(2)
mc!.stream=nil //r(1)
Myclass2.stream=nil // r(0)

图示引用计数.png

关于Auto Release

import Foundation

class FileStream{
  init(){
    print("open file...")
  }    
  func process(){
    print("process file...")
  }
  deinit{
    print("close file...")
  }
}
func getStream()-> FileStream?{
  var fs:FileStream?

  fs=FileStream()
  return fs;
}
func useNativeSwiftObject(){
  for index in 0...10{
    print("\(index) for start...")
      var stream=getStream()
      stream?.process()
      stream=nil
      print("\(index) for end...\n")
  }
}
/*
func useObjecAutoreleaseObject(){
  if let filepath = NSBundle.mainBundle().pathForResource("2015",ofType:"jpg"){
    for _ in 0..<5{
      autoreleasepool{
        for _ in 0..<1000{
          let data=NSdata.dataWithContentsOfMappedFile(filepath)
        }
      }
    }
  }
}
*/
print("\n......invoke......\n")
useNativeSwiftObject()
print("......continue......")

循环引用于内存泄露

class Computer{
  var name: String
  var display: Monitor?
  init(name:String){
    self.name=name
    print("Computer init")
  }
  deinit{
    print("Computer deinit")
  }
}
class Monitor{
  var no: Int
  weak var device: Computer?
  init(no:Int){
    self.no=no
    print("Monitor init")
  } 
  deinit{
    print("Monitor deinit")
  }
}

var imac:Computer?
var screen:Monitor?
imac=Computer(name:"Jason's iMac")
screen=Monitor(no:29)

imac!.display=screen
screen!.device=imac

//imac!.display=nil

imac=nil
screen=nil

循环引用.png 避免循环引用:弱引用.png
import Foundation

class Car{
  var name:String
  var engine:Engine?
  init(name:String){
    self.name=name
    print("Car init")
  }
  deinit{
    print("Car deinit")
  }
}
class Engine{
  var no:Int
  unowned var car : Car
  init(no:Int,car : Car){
    self.no=no
    self.car=car
    print("Engine init")
  }
  deinit{
    print("Engine deinit")
  }
}
var bmw:Car?
var engine:Engine?

bmw=Car(name:"BMW")
engine=Engine(no:400,car:bmw!)

bmw!.engine=engine

bmw=nil
//engine=nil
避免循环引用:无主引用.png
上一篇 下一篇

猜你喜欢

热点阅读