问题
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.
回答1:
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.)
- (void)doSomething:(void(^)())block {
self.block = block;
}
// elsewhere
[self doSomething:^{
self.someProperty = 5;
}];
This creates a retain cycle because self
is referenced (not weakly) within a block to which self
holds a reference.
[UIView transitionWithView:self duration:5, options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
[self setNeedsDisplay];
} completion:nil];
This does not create a retain cycle because the animations
block is sent off to the system -- your UIView
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 call self.setNeedsDisplay()
during the animation since it should be doing that itself...
来源:https://stackoverflow.com/questions/26935149/swift-retain-cycles-and-closures