Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift Deinitialization of Globals

Tags:

ios

swift

My Swift globals are not getting deinitialized.

class Person {
  let name: String
  init(name: String) {
    self.name = name
    println("\(name) is being initialized")
  }
  deinit {
    println("\(name) is being deinitialized")
  }
}

func local() {
  let person = Person(name: "Local")
}

local()

var personp: Person? = Person(name: "Optional Global")
personp = nil

var person = Person(name: "Global")

I am running this in a standalone binary (because apparently the playground has issues with deinit) with optimizations disabled, using Xcode6-Beta3:

> xcrun swift -O0 arc.swift && ./arc
Local is being initialized
Local is being deinitialized
Optional Global is being initialized
Optional Global is being deinitialized
Global is being initialized

Note the missing Global is being deinitialized.

I can't even figure out if this is expected behaviour or a bug, so if it is the former then references to the relevant legalese will be appreciated.

like image 728
Manav Avatar asked Jul 12 '14 04:07

Manav


2 Answers

it looks fine to me... on ending the app nothing is deallocated - there is no point


deinit is only meant to FREE memory and remove observers and stuff - upon ending the process though, this is kinda 'useless' as the process memory 'will be wiped' anyways

==>

SO:

never put anything but memory management / observer related stuff in deinit

If you need a dedicated stop method - write one and call it explicitly before quitting the process

like image 71
Daij-Djan Avatar answered Oct 26 '22 07:10

Daij-Djan


Think of the last line of code as:

var personp: Person? = Person(name: "Optional Global")
personp = nil

var person = Person(name: "Global")

exit(0)

Since person is never set to another value, ARC never decreases the retain count before the exit.

Swift works like a C program in that execution simply terminates and then all memory allocated to the process is returned in one sweep.

This is very different from in-execution memory handling which relies on in-process events to free memory. Since all execution of the program has completely stopped, there is no thread to run the deinit.

So in conclusion, this is just as it should be.

like image 22
Nuoji Avatar answered Oct 26 '22 06:10

Nuoji