Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

block里面全是成员变量 #26

Closed
MrCaiWH opened this issue Jul 26, 2018 · 9 comments
Closed

block里面全是成员变量 #26

MrCaiWH opened this issue Jul 26, 2018 · 9 comments

Comments

@MrCaiWH
Copy link

MrCaiWH commented Jul 26, 2018

我把代码拖进项目中,马上26个警告,这么写好吗?朋友

@chennyhuang
Copy link
Owner

截个图看看哪些成员变量导致了警告

@MrCaiWH
Copy link
Author

MrCaiWH commented Jul 26, 2018

image
block里的成员变量都报了,block里写成员变量也是会引起循环引用的,出了问题还不好排查

@chennyhuang
Copy link
Owner

xcode版本能否告知?

@MrCaiWH
Copy link
Author

MrCaiWH commented Jul 26, 2018

@chennyhuang 9.4

@chennyhuang
Copy link
Owner

理论上UIview的block不会造成循环引用:
首先循环引用发生的条件就是持有这个block的对象,被block里边加入的对象持有。当然是强引用。
所以UIView的动画block不会造成循环引用的原因就是,这是个类方法,当前控制器不可能强引用一个类,所以循环无法形成。
UIView中的block持有当前控制器,但是当前控制器中是没有持有UIView类的,没有形成循环.当动画结束时,UIView会结束持有这个block,如果没有别的对象持有block的话,block对象就会被释放掉,从而block会释放掉对self的持有,整个内存引用关系被解除.

@chennyhuang
Copy link
Owner

当 block 本身不被 self 持有,而被别的对象持有,同时不产生循环引用的时候,就不需要使用 weak self 了。最常见的代码就是 UIView 的动画代码,我们在使用 UIView 的 animateWithDuration:animations 方法 做动画的时候,并不需要使用 weak self,因为引用持有关系是:

UIView 的某个负责动画的对象持有了 block
block 持有了 self
因为 self 并不持有 block,所以就没有循环引用产生,因为就不需要使用 weak self 了。

@MrCaiWH
Copy link
Author

MrCaiWH commented Jul 27, 2018

@chennyhuang 谢谢,学到了,请问作者,可以展示本地拿到的UIImage吗

@chennyhuang
Copy link
Owner

不支持本地,本地的自己写一个了,太简单

@agiapp
Copy link

agiapp commented Aug 16, 2018

去除Block中实例变量警告的方法:Building Settings ->搜索implicit retain of 'self' ,将对应的值改为NO

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants