> On 01 May 2017, at 16:59, Dennis Weissmann <den...@dennisweissmann.me> wrote:
> 
>> 
>> On May 1, 2017, at 4:46 PM, Rien via swift-users <swift-users@swift.org> 
>> wrote:
>> 
>> In my code I use a lot of queues. And (very often) I will use [weak self] to 
>> prevent doing things when ‘self’ is no longer available.
>> 
>> Now I am wondering: how does the compiler know that [weak self] is 
>> referenced?
>> 
>> I am assuming it keeps a reverse reference from self to the [weak self] in 
>> order to ‘nil’ the [weak self] when self is nilled.
>> 
>> But when a job is executing it has no control over the exclusive rights to 
>> [weak self].
>> 
>> I.e. [weak self] may be nilled by an outside event in the middle of say:
>> 
>>      if self != nil { return self!.myparam }
>> 
>> The if finding [weak self] non nil, but the return finding [weak self] as nil
>> 
>> Is that correct? i.e. should we never use the above if construct but always:
>> 
>>      return self?.myparam ?? 42
>> 
> 
> Yes, as you said, you never know when self will be nilled out, that's why you 
> need to create a (temporary) strong reference to it, work on it, and when the 
> block returns, your strong reference is released and self either goes away 
> immediately (incase it was released elsewhere after the local binding to a 
> strong variable and no other objects had a strong reference to it) or it will 
> stay as long as no other object holds a strong reference to it.
> 
> When the closure is more involved than a view lines, I often do a guard let 
> `self` = self else { return } to conveniently work with a strong self inside 
> the rest of the closure.

I was aware of that practise (use it myself) but I was not sure if it would 
always work.
I.e. I have not found it documented that
        let strongSelf = self
will actually retain ‘self’ an not create a strong reference to an intermediate 
reference to self.

It makes sense though, otherwise there would be massive failures ‘out there’. 
;-)

Thanks,
Rien.

> 
>> Regards,
>> Rien
>> 
>> Site: http://balancingrock.nl
>> Blog: http://swiftrien.blogspot.com
>> Github: http://github.com/Balancingrock
>> Project: http://swiftfire.nl - A server for websites build in Swift
>> 
>> 
>> 
>> 
>> 
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-users
> 
> - Dennis

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

Reply via email to