循环引用不释放控制器

理论不介绍,直接上干货~

一、检测

检测控制器是否被释放,可以检测是否调用了-dealloc生命周期方法。

二、修复

1、因为NSTimer没有释放的原因

避免方式:记得将NSTimer对象timerObj失效与置空。

[self.timerObj invalidate];
self.timerObj = nil;

2、成为别人的委托对象,却把自己给搭进去出不来

避免方式:声明delegate时请用assign(MRC)或者weak(ARC)。

3、block环

避免方式:

【1】如果是属性

@property (nonatomic, assign) NSInteger *age;

在block外面:__weak typeof(self) weakSelf = self;

在block里面:weakSelf.age = 18;

【2】如果是成员变量

{
    NSString *_name;
}

在block外面:__weak typeof(self) weakSelf = self;

在block里面:__strong typeof(weakSelf) strongSelf = weakSelf;

strongSelf->_name = @“Ming”;

时间: 2025-01-24 14:05:59

循环引用不释放控制器的相关文章

初识iOS NSTimer 循环引用不释放问题

原文转自 :http://www.codecate.com/code/?p=77 最近开发遇到NSTimer Target 造成循环引用问题,不释放,以下是解决方案. stackoverflow上的一个解决方案 http://stackoverflow.com/questions/16821736/weak-reference-to-nstimer-target-to-prevent-retain-cycle 原文如下 Weak Reference to NSTimer Target To Pr

Block循环引用,强引用方法引起的循环引用,CenterX CenterY 不生效的问题

相信大家都用过CenterX 和 CenterY吧,这2个属性确实非常方便,但是有些时候会发现突然设置了CenterX CenterY不好使了,不居中了,一头雾水.这种情况 我建议第一时间去看看设置CenterX CenterY之前有没有设置size 也就是 宽和高.如果在设置宽高之前就设置了CenterX CenterY 肯定是不生效的,原因不用多说了吧,如果是这种情况,将先设置一下size就好了. 上一篇文章提到了block里面用了self从而导致了 循环引用,控制器释放不了,有些朋友知道应

iOS开发——Block引起循环引用的解决方案

内存问题始终是软件开发中的头等大事,iOS开发中也不例外,在面试中也是必问的问题.今天我们主要来讲讲Block中涉及的循环引用问题.当我们自己一开始写代码的时候,可能会大量在block中使用self,但是当看到别人优秀的代码的时候,发现别人常常不是用self,而使用weakSelf. 为什么呢?本文的示例代码上传至 https://github.com/chenyufeng1991/Block_WeakSelf . 首先我先来说说内存管理的原则: 1.默认使用strong,可选weak.stro

OC_内存管理(二)对象复制、循环引用问题、自动释放池

循环调用: 1.循环引用的问题 两个对象A.B,有可能会出现特殊情况:A中包含B的实例变量:B中也包含A的实例变量,如果这两个实例变量都是强引用(A有着B的实例变量所有权,B也有A的实例变量所有权),然后在两个对象销毁时,会出现A.B都不能正常销毁的情况.下面用代码来演示循环调用问题: ClassA的头文件Class.h代码 #import <Foundation/Foundation.h> //类的前向声明 @class ClassB; //类的前向声明与包含头文件的区别?Q: @inter

iOS Block循环引用

前言 本篇文章精讲iOS开发中使用Block时一定要注意内存管理问题,很容易造成循环引用.本篇文章的目标是帮助大家快速掌握使用block的技巧. 我相信大家都觉得使用block给开发带来了多大的便利,但是有很多开发者对block内存管理掌握得不够好,导致经常出现循环引用的问题.对于新手来说,出现循环引用时,是很难去查找的,因此通过Leaks不一定能检测出来,更重要的还是要靠自己的分析来推断出来. 声景一:Controller之间block传值 现在,我们声明两个控制器类,一个叫ViewContr

【IOS学习基础】weak和strong、懒加载、循环引用

一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成引用计数加1:而strong则相当于OC中规定retain,它会造成引用计数加1”. ARC的原理:只要还有一个变量指向对象,对象就会保持在内存中.当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放.这条规则对于实例变量.synthesize属性.局部变量都是适用的 strong指针能够保

Block的循环引用详解

1.首先我们创建了一个网络请求工具类 然后storyboard里面去创建了一个导航控制器 并且把它设置为初始控制器   然后拖入一个bar button  --show--到自带的控制器 这个时候运行代码的结果是 x 显然这个时候没有造成循环引用 为什么呢?????????????????? //没有self的时候是没有循环引用的 //tools是一个局部的变量 执行完了就会被释放掉了 //这个时候出现了self没有出现循环引用  控制器也被释放了 //block是右边的finished  fi

iOS之weak和strong、懒加载及循环引用

一.weak和strong 1.理解 刚开始学UI的时候,对于weak和strong的描述看得最多的就是“由ARC引入,weak相当于OC中的assign,但是weak用于修饰对象,但是他们都不会造成引用计数加1:而strong则相当于OC中规定retain,它会造成引用计数加1”. ARC的原理:只要还有一个变量指向对象,对象就会保持在内存中.当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放.这条规则对于实例变量.synthesize属性.局部变量都是适用的 strong指针能够保

IOS开发--循环引用问题,普通控件为什么用weak,代理为什么用weak,block内用到外面的东

所有的引用计数系统,都存在循环应用的问题. 例如下面的引用关系对象: a创建并引用到了对象b. 对象b创建并引用到了对象c. 对象c创建并引用到了对象b. 这时候b和c的引用计数分别是2和1.当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放.b不释放,c的引用计数就是1,c也不会被释放.从此,b和c永远留在内存中,造成内存浪费.这种情况,必须打断循环引用,通过其他规则来维护引用关系. 那么普通控件为什么要用weak: 如下图控制器中的Vie