import Cocoa class TestClass { var name = "" var block1: (() -> Void)? var block2: (() -> Void)? var retainCount: Int { CFGetRetainCount(self) } init() { print("Initializing: \(retainCount)") } func foo() { print("Starting Foo: \(retainCount)") block1 = { [weak self] in print("Inside block 1: \(String(describing: self?.retainCount))") self?.block2 = { print("Inside block 2: \(String(describing: self?.retainCount))") } // Execute block 2 self?.block2?() print("Finishing block 1: \(String(describing: self?.retainCount))") } // Execute block 1 block1?() print("Finishing Foo: \(retainCount)") } func bar() { print("Starting Bar: \(retainCount)") block1 = { [weak self] in guard let self = self else { return } print("Inside block 1: \(self.retainCount)") self.block2 = { [weak self] in print("Inside block 2: \(String(describing: self?.retainCount))") } // Execute block 2 self.block2?() print("Finishing block 1: \(self.retainCount)") } // Execute block 1 block1?() print("Finishing Bar: \(retainCount)") } deinit { print("Deinitializing: \(retainCount)") } } var testClass: TestClass? = TestClass() testClass?.foo() testClass?.bar() testClass = nil