UIView.animate() : 我是否需要在动画块中对self进行弱引用?[重复]

问题描述 投票:1回答:1

经过一些研究,我发现我的应用程序使用了太多的能源,因为几个 UIView 在整个应用程序中,我捕捉到了相关的动画。UIViewController 的完成块中,而不对其进行弱引用。

所以实际上,我把这个。

func animate() {
    UIView.animate(withDuration: 0.3, animations: {
        self.label.alpha = 0.5
    }) { _ in 
        self.animate()
    }
}

改成了这个:

func animate() {
    UIView.animate(withDuration: 0.3, animations: {
        self.label.alpha = 0.5
    }) { [weak self] _ in 
        self?.animate()
    }
}

然而,我想知道,我是否需要对下面的 animationself.label.alpha = 0.5 一)?

谢谢你的帮助

ios swift animation uiview
1个回答
2
投票

当然,你 确需 以用 "弱小的自我 "概念在那里。

其实请注意:这的确是 很常见 在这种情况下,一个VC在动画中被糟蹋了......所以的确,这是你 "最需要 "使用弱小的自我想法的地方之一。在动画中忘记这一点是项目中很常见的错误。

对了,这里有一个方便的语法,任何时候你需要弱小的自己。

func animate() {
    UIView.animate(withDuration: 0.3, animations: { [weak self] in
        guard let self = self else { return print("gotchya!") }
        self.label.alpha = 0.5
    }) { [weak self] in
        guard let self = self else { return print("gotchya!") }
        self.animate()
    }
}

加入这一行...

        guard let self = self else { return }

......看起来有点啰嗦,但是,这意味着你不需要在 "self "后面加上"?",每次你在长块中使用它的时候。

通常你会在这样的区块里面有很多 "self...... "的用法,而只用 "让self=self "这个成语似乎更一致。

enter image description here

因此,即使块中只有一行代码(就像你的两个例子一样),这也是一个很好的方法,可以使各处的代码绝对一致,并保持简单。

注意,每当你有一个 { return } 你可以只添加一个打印声明,这样你就知道在开发过程中发生了什么...。

.... { [weak self] in
  guard let self = self else { return print("I avoided a crash, woot!") }

.... { [weak self] in
  guard let self = self else { return print("logical disaster near line 66") }

你不必这样做,"{ return }"就可以了。只是为了方便你。

"self = self "到底是什么鬼?

如果你觉得 "self = self "这个成语很混乱......老实说,你就别管它了。总是用这个成语。 这其实只是你随处可见的 "标准 "事物。

在你的代码库中,永远追求简单的一致性!

更多弱小的自我奥秘....

下面是一位帅榜成员的有趣QA。弱小的自己去哪里了?

后面还有这样的困惑要担心。弱者参照物和无主参照物的区别是什么?


0
投票

什么叫无主参考?

我的应用耗费了太多的能量

我看不出保留一个人和一个人之间有什么直接的关系。weak 视图控制器上的参照物,节省能源。self 而不增加其在闭包中的保留次数(这就是我们所说的在对象上有一个弱引用的意思),这意味着如果你的视图控制器上没有其他的强引用存在,那么你的视图控制器将更快被释放。也许你会在短期内节省一些内存。

我建议你去别的地方调查一下,看看你的 "能量 "问题从何而来。

有很多文章都是关于使用 weak 关键字。

https:/medium.comflawless-app-storiesyou-dont-always-need-weak-self-a778bec505ef。


0
投票

你不需要使用 [weak self] 静态功能 UIView.animate() 当可以保留周期且动画块不被自己保留时,你需要使用弱。

有一个 文章 介质上 [weak self] 可有可无

更多信息。

能量问题可能还有一个问题。


0
投票

不,这种情况下不需要,动画和完成是不被自己保留的,所以不存在强保留周期的风险。

重复的 在UIView.animateWithDuration(...)的闭包中是否需要使用[无主自体]?

© www.soinside.com 2019 - 2024. All rights reserved.