Is callback an autoclosure, or just a regular argument? -Kenny
> On Mar 3, 2017, at 1:14 PM, Alex Johnson via swift-evolution > <[email protected]> wrote: > > Hi list members, > > During code review today, I noticed a really subtle memory leak that looked > like: > > self.relatedObject = RelatedObject(callback: relatedObjectDidFinish) > > Where `relatedObject` is a strong reference, `callback` is an escaping > closure, and `relatedObjectDidFinish` is a method of `self`. From a memory > management perspective, this code is equivalent to: > > self.relatedObject = RelatedObject(callback: { > self.relatedObjectDidFinish }) > > In the second example, an explicit `self.` is required. It’s my understanding > that this is to highlight that the closure keeps a strong reference to > `self`. But, when passing a method, there is no such requirement, which makes > it easier to accidentally create a retain cycle. > > This made me wonder if an explicit `self.` should be required when passing a > method as an escaping closure. And whether that would help in the same way > that the explicit `self.` *inside* the closure is intended to. > > If it were required, the code in the first example would be: > > self.relatedObject = RelatedObject(callback: self.relatedObjectDidFinish) > > What do you think? > > Alex Johnson > [email protected] <mailto:[email protected]> > ajohnson on Slack > _______________________________________________ > swift-evolution mailing list > [email protected] <mailto:[email protected]> > https://lists.swift.org/mailman/listinfo/swift-evolution > <https://lists.swift.org/mailman/listinfo/swift-evolution>
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
