场景一 :NStimer

timer就是一个能在从如今開始的未来的某一个时刻又或者周期性的运行我们指定的方法的对象

NSTimer运行的必要条件:相应线程的RunLoop要开启,mode要相应

以下看timer的循环引用:

如图,我们写这种一个类,当我们初始化这个类就会有一个timer开启。然后当我们去释放当前类的时候,是不会走dealloc函数的,由于timer会对当前类count +1,然后timer持有self,self持有timer就造成了死循环。造成内存泄露。而打破循环引用的方法就是Invalidate。

场景 二:[self performSelector:@selector(method:) withObject:self afterDelay:5];

当方法还没有运行的时候,要返回父视图释放当前视图的时候。self的计数没有降低到0,而导致无法调用dealloc方法,出现了内存泄露

解决方式:

1.[NSObject cancelPreviousPerformRequestsWithTarget:self]

2.[NSObjectcancelPreviousPerformRequestsWithTarget:self selector:@selector(method1:)object:nil]

场景 三:addObserver

Q&A:

1.向NSNotificationCenter中addObserver后,有没有对这个对象进行引用计数加1操作?

2.在一个已经释放的NSObject类 以及一个ViewController类发通知结果会如何?

3. [[NSNotificationCenter defaultCenter] removeObserver: name: object:nil];

和.

[[NSNotificationCenter defaultCenter] 
removeObserver:] 怎样选取

我们首先解决第2个问题。在一个已经释放的NSObject类 以及一个ViewController类发通知  NSObject会crash。会提示一个地址错误。说明通知仅仅是记住了他的地址指针,技术并没有加1,而对ViewController类发通知
不会发生crash。为什么会这样?

那就是:ViewController在dealloc的时候会调用  [[NSNotificationCenter defaultCenter]  removeObserver:self] ;

而我们怎么去验证呢。那就是给NSNotificationCenter加一个类别,重写removeObserver:self方法。就会非常easy的发现,你还会发如今dealloc的时候会移除系统的通知,实际上苹果就是这么做的。

最后一个问题:那么怎样让抉择? 就是在除了Dealloc以外的地方都不要调用removeObserver:self
  而是使用单个移除的方法[[NSNotificationCenter defaultCenter] removeObserver: name: object:nil];

场景四:

Try 有风险。Catch需慎重

@try{

//可能抛出异常的代码

}

@catch(NSException *exception) {

//处理异常

}

@finally{

//finally
代码块是可选的

//
但假设写了 finallyblock,无论有没有异常,block
内的代码都会被运行

}

然后 我们就能够发挥了:

@try {

//可能抛出异常的代码

TestTryctch*object = [[TestTryctch alloc] init];

[object doSmMayThrowException];//异常函数

[object release];

}

@catch (NSException *exception) {

//处理异常

NSLog(@"throw an exception:%@", exception.reason);

}

@finally {

NSLog(@"finally execution");

}

上述代码会不会有异常???

会,当然会。, [object doSmMayThrowException];//异常函数  直接就会跳过  [object release]; 。产生内存泄露

场景五:死循环

CATransition*transition = [CATransition animation];

transition.duration= 0.5;

tansition.repeatCount= HUGE_VALL;

[self.view.layeraddAnimation:transition forKey:"myAnimation"]

,假设HUGE_VALL 为一个非常大的数就会内存泄露 解决方式:

-(void)viewWillDisappear:(BOOL)animated{

[self.view.layer removeAllAnimations];

}

iOSeasy造成循引用的场景的更多相关文章

  1. iOS循环引用常见场景和解决办法

    好多场景会导致循环引用,例如使用Block.线程.委托.通知.观察者都可能会导致循环引用. 1.委托 遵守一个规则,委托方持有代理方的强引用,代理方持有委托方的弱引用. 实际场景中,委托方会是一个控制 ...

  2. 解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json

    1..Net开源Json序列化工具Newtonsoft.Json中提供了解决序列化的循环引用问题: 方式1:指定Json序列化配置为 ReferenceLoopHandling.Ignore 方式2: ...

  3. eclipse在多modules项目结构下避免模块间依赖引用的场景

    这个在单一classLoader时,不会有问题.如果多classloader下会有问题. 假设工程有两个模块,module2 依赖module1 当我们执行mvc eclipse:eclipse后,然 ...

  4. C++ 之引用

    int argc ,char * argv[] - argument count & argument vector argc - 命令行参数个数,argv[]依次指向每一个命令行参数,其中a ...

  5. Swift2.1 语法指南——自动引用计数

    原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...

  6. Swift 自己主动引用计数机制ARC

    Swift 使用自己主动引用计数(ARC)这一机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 的内存管理机制会一直起着作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自 ...

  7. Swift 学习笔记 (三) 之循环引用浅析

    原创:转载请注明出处 110.自动引用计数实践 下面的例子展示了自动引用计数的工作机制.例子以一个简单的Person类开始,并定义了一个叫name的常量属性: class Person {     l ...

  8. Android性能提升之强引用、软引用、弱引用、虚引用使用

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52637333 背景:收到公众投稿 ...

  9. Dubbo原理和源码解析之服务引用

    一.框架设计 在官方<Dubbo 开发指南>框架设计部分,给出了引用服务时序图: 另外,在官方<Dubbo 用户指南>集群容错部分,给出了服务引用的各功能组件关系图: 本文将根 ...

随机推荐

  1. zoj3256

    好题,由m的范围知道这肯定是矩阵乘法加速插头dp,关键是怎么写 以往插头dp常用逐格递推,而这道题要求整行逐列递推 这样我们才能构造转移矩阵. 我们可以通过假象一个第0列来将路径转化为回路问题 逐列递 ...

  2. 使用threadpool并发测试,报错HTTPConnectionPool Max retires exceeded

    解决方法:和以下答案一致 https://blog.csdn.net/qq_21405949/article/details/79363084 场景: 在做爬虫项目或者是在发送网络请求的时候,一般都会 ...

  3. 51nod 编辑距离问题(动态规划)

    编辑距离问题 给定两个字符串S和T,对于T我们允许三种操作:(1) 在任意位置添加任意字符(2) 删除存在的任意字符(3) 修改任意字符 问最少操作多少次可以把字符串T变成S? 例如: S=  “AB ...

  4. ( 转 ) 优秀REST风格 API的设计原则

    设计优秀的REST风格API非常困难!API是服务提供方和使用方之间的契约,打破该契约将会给服务端开发人员招来非常大的麻烦,这些麻烦来自于使用API的开发人员,因为对API的改动会导致他们的移动app ...

  5. [BZOJ1143][CTSC2008]祭祀river(Dilworth定理+二分图匹配)

    题意:给你一张n个点的DAG,最大化选择的点数,是点之间两两不可达. 要从Dilworth定理说起. Dilworth定理是定义在偏序集上的,也可以从图论的角度解释.偏序集中两个元素能比较大小,则在图 ...

  6. [BZOJ1559]密码

    数据范围特别小,考虑状压DP 因为要求给定的字符串在母串中出现,所以可以用AC自动机辅助DP 因为AC自动机不能处理模式串互相包含的情况,所以先把互相包含的串去掉(暴力就行,数据范围太小) 因为要状压 ...

  7. 【动态规划】【最长上升子序列】【贪心】bzoj1046 [HAOI2007]上升序列

    nlogn求出最长上升子序列长度. 对每次询问,贪心地回答.设输入为x.当前数a[i]可能成为答案序列中的第k个,则若 f[i]>=x-k && a[i]>ans[k-1] ...

  8. 使用jQuery操作dom(追加和删除样式-鼠标移入移出)练习

    1.实现鼠标移入则添加背景色,鼠标移出则删除背景色 <!DOCTYPE html> <html> <head> <title>test1.html< ...

  9. EF 通用数据层父类方法小结

    MSSql 数据库 数据层 父类 增删改查: using System;using System.Collections.Generic;using System.Data;using System. ...

  10. 如何提高码农产量,基于ASP.NET MVC的敏捷开发框架之移动端开发随笔二

    前言 在前一篇文章中我已经做过开篇,接下来的随笔会详细讲一下我们的开发框架是如何实现的,专业的事由专业的人来讲,以后就由我们的高级码农小李英文名查尔斯和他的师父厂长(因为姓陈,酷爱摄影,我们的文艺片都 ...