I have tried to do a lot of research on understanding retain cycles. I can't seem to find anything on my examples though. I do know that if i set a property to a closure then a retain cycle happens and need to use weak or unowned. But i have 2 examples that I would like to know if they are done correctly: Thanks in advance, I have tried to see if they are on stackoverflow already but couldn't find anything.
Simple animations
UIView.transitionWithView(self, duration: 5, options: .TransitionCrossDissolve, animations: { [weak self] in
self?.setNeedsDisplay()
return
}, completion: nil)
Animations with an array
for imageView in self.townImages {
UIView.transitionWithView(imageView, duration: 0.3, options: .TransitionCrossDissolve, animations: { () -> Void in
imageView.image = UIImage(named: self.getImages()[count++])
}, completion: nil)
}
In both of these examples self
is a subclass of UIView
. I would just like to know that I am doing it correctly or if I should be using the imageView as weak reference too. Thanks.
Neither of these will create retain cycles since the block is not attached to
self
. Additionally, retain cycles with guaranteed life span aren't the worst thing in the world.Let's consider some examples. (sorry, my swift isn't particularly strong, so I'm going to revert to obj-c.)
This creates a retain cycle because
self
is referenced (not weakly) within a block to whichself
holds a reference.This does not create a retain cycle because the
animations
block is sent off to the system -- yourUIView
subclass doesn't hold a reference to the block.Side note: You shouldn't need to have a
return
at the end of your closure, but I guess swift is ridiculous and tries to be "helpful". Also, I'm not sure you need to callself.setNeedsDisplay()
during the animation since it should be doing that itself...