Swift Retain Cycles and Closures

僤鯓⒐⒋嵵緔 提交于 2019-12-10 13:56:07

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!