Search code examples
iosobjective-cmemory-managementios-multithreading

weakSelf not _always_ needed in iOS and ObjC, right?


Help me resolve a tiny argument with a colleague. Weak self is not needed in this circumstance, right?

(He doesn't believe me)

__weak auto weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
    [weakSelf _someHelper];
});

Solution

  • Correct, it is not always needed in cases like this. We often wouldn’t bother with this syntactic noise in this situation.

    If it was dispatch_after or if this dispatch back to the main queue was buried inside some asynchronous call, then there’s an argument for weakSelf pattern (so you don’t keep strong reference longer than might be needed), but in your simple example, dispatching immediately to the main queue, the weak reference to self is not needed.

    That having been said, it’s not wrong to adopt weakSelf pattern here. Just unnecessary.


    The question in my mind is that if you’re dispatching back to the main queue, that suggests you are in the middle of something time consuming on some background queue. In that case, then refraining from keeping strong reference to self may well be prudent. We can’t say without seeing the broader context of where you are performing this code.