I got bit again by a sneaky memory leak concerning local functions and would 
like to discuss a small language change. I vaguely remember this being 
discussed in the past, but can’t find the thread (if anybody could point me to 
it, I’d appreciate it). Basically, here’s an example of the leak:

class A {
    func foo() {
        func local() {
            bar()
        }
    
        methodWithEscapingClosure { [unowned self] _ in
            self.bar()
            local() // this leaks because local captures self
        }
    }
    
    func bar() {
    }
}

Its sneaky because local’s capturing of self is not obvious if you’ve trained 
your brain to watch out for calls prefixed with self. I would suggest having 
the compiler force users to make self capturing explicit, the same way it does 
for closures:

class A {
    func foo() {
        func local() {
            bar() // error: Call to method ‘bar' in function ‘local' requires 
explicit 'self.' to make capture semantics explicit
        }
    
        // ...
    }
}

What do you think?

David.

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to