上delloc 无呼叫 故障排除 笔记[通俗易懂]

上delloc 无呼叫 故障排除 笔记

大家好,又见面了,我是全栈君,今天给大家准备了Idea注册码。

经验 delloc 无呼叫 基本上可以得出结论,即循环引用的原因。

遇到这样的情况基本上可分为  

1: 属性声明weak的地方 写成了 strong  。比方delegate。

2: block语法块中 存在的强引用。

所以遇到delloc 基本上排查下这两种情况 就能解决80%的问题了。 

可是现实中往往会有遇到一些其它的问题所在 。比方 我今天遇到的一个viewcontroller  一直没有释放。全局搜索了这个文件中面 全部用到的 delegate 以及self.  和_XX 属性 结果 发现都没问题。  能够返回上一级页面 此viewcontroller 却一直没有调用。 后来发现这个问题出在父类的身上。

伪代码例如以下



@implementation BaseViewController ()

– (id)init

{

    self = [super init];

    if (self) {

         self.back = [[CustomItem allocinitWithtitle:returnHomeString clickedBlock:^(id sender) {

  [super goBack];
      }];

}

@end

@interface ViewControllerA : BaseViewController

– (id)init

{

    self = [super init];

    if (self) {

           }

}

@end


ViewControllerA 一直没有释放。当时在ViewControllerA 搜寻了半天也没查出是哪里问题来,后来往父类去 看 结果发现了这种代码。当时也是醉了。



遇到这样的情况 事实上有两种改动方式 


A 直接将   [super goBack];  提取出来  封装成另外一个函数 比方 goBackFunc,然后在block 中再利用weakSelf 去调用goBackFunc

B 利用反射机制取到父类

 BaseViewController *strongSelf = weakSelf;

if(strongSelf){

struct

objc_super
superSelf = { strongSelf, [
BaseViewController

superclass
] };

                objc_msgSendSuper(&superSelf, @selector(goBack));

}

这样子  直接在block块中替换代码
能够用不另外封装函数。



PS  关于Instruments 的 Allocations  也有一个陷阱 。当发现你写的代码 已经调用了delloc, 可是显示的Persistent 值并没有降低一直添加时  检查下是否之前打开过zombie模式。 有的话关掉  。这两个模式是冲突的。



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116674.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 免费搭建属于自己的域名个性邮箱

    免费搭建属于自己的域名个性邮箱

    2022年2月18日
    59
  • SpringBoot整合RabbitMQ之实战

    SpringBoot整合RabbitMQ之实战实战前言RabbitMQ作为目前应用相当广泛的消息中间件,在企业级应用、微服务应用中充当着重要的角色。特别是在一些典型的应用场景以及业务模块中具有重要的作用,比如业务服务模块解耦、异步通信、高并发限流、超时业务、数据延迟处理等。其中课程的学习链接地址:https://edu.csdn.net/course/detail/9314RabbitMQ官网拜读首先,让我们先拜读Ra…

    2022年5月14日
    38
  • Java中的增强型for循环「建议收藏」

    Java中的增强型for循环「建议收藏」增强型for循环定义如下:for(ElementTypeelement:arrayName){};上述for循环可被读为:foreachelementinarrayNamedo{…}——————————————————————————————-…

    2022年6月16日
    37
  • 3D电影的原理_3D电影制作

    3D电影的原理_3D电影制作在搞清楚3D立体原理之前我们先了解什么是“真3D”:我们肉眼所看到的景像是一种具有层次、深度的立体影像。一般我们所谓3D游戏或电影,实际上并非真正的3D;因为屏幕先天即是2D

    2022年8月5日
    4
  • python怎么安装matplotlib.pyplot_python安装matplotlib模块

    python怎么安装matplotlib.pyplot_python安装matplotlib模块总结经验,前排感谢CSDN大神…一、在Pycharm中安装matplotlib1、打开AnacondaPrompt,输入pipinstallmatplotlib输入pipinstallmatplotlib==3.3.0限制下载的版本为3.3.0.这是为了防止版本过新,之后在PyCharm运行时出现问题。2、打开PyCharm(1)依次点击File-Settings-…

    2022年8月25日
    10
  • 用PS修复老照片_photoshop修复老照片

    用PS修复老照片_photoshop修复老照片原图素材虽然很旧,不过人物部分并没有怎么损坏,只是有一些色块和杂色。修复的工程相对来说也少很多。只需要给人物磨好皮,然后把暗调和高光部分调出来即可。原图原图素材虽然很旧,不过人物部分并没有怎么损坏,

    2022年8月3日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号