iOSeasy造成循引用的场景
场景一 :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造成循引用的场景的更多相关文章
- iOS循环引用常见场景和解决办法
好多场景会导致循环引用,例如使用Block.线程.委托.通知.观察者都可能会导致循环引用. 1.委托 遵守一个规则,委托方持有代理方的强引用,代理方持有委托方的弱引用. 实际场景中,委托方会是一个控制 ...
- 解决MVC Json序列化的循环引用问题/EF Json序列化循引用问题---Newtonsoft.Json
1..Net开源Json序列化工具Newtonsoft.Json中提供了解决序列化的循环引用问题: 方式1:指定Json序列化配置为 ReferenceLoopHandling.Ignore 方式2: ...
- eclipse在多modules项目结构下避免模块间依赖引用的场景
这个在单一classLoader时,不会有问题.如果多classloader下会有问题. 假设工程有两个模块,module2 依赖module1 当我们执行mvc eclipse:eclipse后,然 ...
- C++ 之引用
int argc ,char * argv[] - argument count & argument vector argc - 命令行参数个数,argv[]依次指向每一个命令行参数,其中a ...
- Swift2.1 语法指南——自动引用计数
原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...
- Swift 自己主动引用计数机制ARC
Swift 使用自己主动引用计数(ARC)这一机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 的内存管理机制会一直起着作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自 ...
- Swift 学习笔记 (三) 之循环引用浅析
原创:转载请注明出处 110.自动引用计数实践 下面的例子展示了自动引用计数的工作机制.例子以一个简单的Person类开始,并定义了一个叫name的常量属性: class Person { l ...
- Android性能提升之强引用、软引用、弱引用、虚引用使用
转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52637333 背景:收到公众投稿 ...
- Dubbo原理和源码解析之服务引用
一.框架设计 在官方<Dubbo 开发指南>框架设计部分,给出了引用服务时序图: 另外,在官方<Dubbo 用户指南>集群容错部分,给出了服务引用的各功能组件关系图: 本文将根 ...
随机推荐
- (八)for语句
(1)语法 (2)批量ping主机 这里有个重点就是把每次ping主机的动作放到后台运行 #!/bin/bash >ip.txt for i in {1..254} do ip=192.168. ...
- logging 日志两种使用方法(转)
下面我们使用代码logging的代码来说明: 使用baseConfig()函数对 logging进行 简单的 配置: import logging; # 使用baseConfig()函数,可选参数有f ...
- Codeforces #445 Div2 D
#445 Div2 D 题意 给出一些字符串,要求构造一个最短的且字典序最小的字符串,使得给出的字符串都为目标字符串的子串,且这些字符串作为子串出现的次数都是最多的,如果不存在目标字符串输出 &quo ...
- window下安装rsyncServer
window下安装rsyncServer---------------------------------1. 解压cwRsyncServer_4.0.5_Installer.zip,安装. 2. 复 ...
- 17、Flask实战第17天:Flask-cookie
cookie的基本概念 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接并且登录成功后,第二次请求服务器依然不能知道当前请求的是哪个用户. cookie的出现就是为了解决这个问题,第一 ...
- IDEA的Maven项目找不到class
- [Contest20180316]Mythological IV
令$S(n)=\sum\limits_{i=0}^{n-1}f(i)q^i$,那么存在一个次数$\leq k$的多项式使得$S(n)=q^ng(n)-g(0)$(证明来自杜教的PPT) 设$f$的次数 ...
- 【AC自动机/fail树】BZOJ3172- [Tjoi2013]单词
[题目大意] http://www.lydsy.com:808/JudgeOnline/problem.php?id=3172 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多 ...
- 浙南联合训练赛 B-Laptops
One day Dima and Alex had an argument about the price and quality of laptops. Dima thinks that the m ...
- 数据结构之B-树,你每天都在用的,源码发布!
五一前就筹划着写下这篇文章,但是迫于自己从来没有实现过B-树(如果大家感兴趣,我可以考虑写一篇B+树的文章),手中没有源代码,另外自己以前对B-树也是一知半解状态中,担心误人子弟,在4月30日终于把代 ...