为什么您永远不应该将封闭/块保留为强?

因为

曾经有个好主意说:

不要让任何东西变得足以摧毁你。

开玩笑!
这只是我自己想到的。

我正在修复错误。 我确实修复了它,但我不知道它会在其他功能上产生连锁反应。 我所做的只是在从主线程上的API提取数据后,仅更新UI。 这是一个主屏幕,我们在其中隐藏了我用来更新UI的功能内的导航栏(我不知道被隐藏的导航栏也位于该功能内)。

两天后,QA向我提出了一个错误,即从Home控制器转到另一个控制器后,导航栏在几秒钟后自动隐藏起来。 仅当您在应用程序打开后从Home转到另一个控制器时,才会发生该错误。 该错误真的很奇怪,因为在视图控制器的viewDidLoad中, setNavigationBarHidden设置为NO ,并且无法正常工作。 然后,我尝试在存在API调用的地方将setNavigationBarHidden设置为NO 。 这似乎也不起作用。 我在整个项目中搜索了setNavigationBarHidden ,发现唯一将其设置为YES的地方是一个未被使用的控制器。 这有点烦人,因为我似乎无法真正从setNavigationBarHidden的位置设置为YES

好吧,我当然很累,字面意思是:

因此,我决定向同事寻求帮助(你们也应该尝试一下。当您讨论事物时,它总是有帮助的)。

首先,他还尝试了与我相同的方法,然后为了调试setNavigationBarHidden属性,我们决定覆盖 setNavigationBarHidden属性,并查看从何处设置该属性(我不知道为什么一开始我就没想到它)。

调试后,它使我进入了两天前在Home控制器的主线程内调用的UI更新功能。 因为UI更新功能是在dispatch_get_main_queue()内部编写的,所以它是一个闭包。 不可避免地,将Home控制器的自身捕获到内部,这导致导航栏隐藏。

因此,通过在weaks_get_main_queue dispatch_get_main_queue()内部提供更新的UI更新功能可以解决此问题。

对于所有想知道为什么我只找到一个setNavigationBarHidden集的人 搜索整个项目后,请选择“是” 。 原因是用于隐藏导航的属性,直接有navigationBarHidden而不是它的setter。 我的错。 原谅我太人性化了。 😀

是的,仅仅是一个强大的封闭/障碍 会浪费很多时间。

学过的知识!