上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年1月17日 下午7:00
下一篇 2022年1月17日 下午7:00


相关推荐

  • ios个人开发者账号购买_马斯克回应推特收认证费用

    ios个人开发者账号购买_马斯克回应推特收认证费用原文网址:http://blog.sina.com.cn/s/blog_134451adb0102w152.html第一步:注册appleID登录https://developer.apple.com,选择MemberCenter​ ​填写邮箱地址(作为AppleID)、密码、名、姓(⚠️不要填反了。。。)、生日​

    2025年6月2日
    4
  • 算法:记忆化搜索「建议收藏」

    算法:记忆化搜索「建议收藏」概述记忆化搜索是一种典型的空间换时间的思想。记忆化搜索的典型应用场景是可能经过不同路径转移到相同状态的dfs问题。更明确地说,当我们需要在有层次结构的图(不是树,即当前层的不同节点可能转移到下一层的相同节点)中自上而下地进行dfs搜索时,大概率我们都可以通过记忆化搜索的技巧降低时间复杂度。例子:青蛙过河题目描述一只青蛙想要过河。假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表stones(用单

    2022年7月26日
    15
  • 什么是Volatile关键字?

    什么是Volatile关键字?一、Java的内存模型(JMM)在仔细讲解Java的volatile关键字之前有必要先了解一下【Java的内存模型】Java的内存模型简称JMM(JavaMemoryModel),是Java虚拟机所定义的一种抽象规范用来屏蔽【不同硬件】和【操作系统】的【内存访问差异】。让Java程序在各种平台下都能达到一致的内存访问效果。…

    2022年7月27日
    8
  • Bitmap MakeTransparent()方法

    Bitmap MakeTransparent()方法此方法是默认的颜色对此Bitmap通明定义如下:publicvoidMakeTransparent()没有返回值例如:MakeTransparent(_normalImage);private

    2022年7月4日
    22
  • oracle查看表字段类型_oracle更改表字段类型

    oracle查看表字段类型_oracle更改表字段类型查看oracle中的表的字段类型的sql:selectCOLUMN_NAME,DATE_TYPE,DATA_LENGTH,DATA_PRECISIONfromall_tab_columns

    2025年9月4日
    9
  • karate框架接口测试

    karate框架接口测试序言 win10 下载安装 jdk gt 1 8C Users vick gt java versionjavav 1 8 0 121 Java TM SERuntimeEnv build1 8 0 121 b13 JavaHotSpot TM 64 BitServerVM build25 121 b13 mixedmode 下载安装 mavenC Users vick gt mvn vApacheMaven 8

    2026年3月17日
    1

发表回复

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

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