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];

}

时间: 2024-08-01 10:40:55

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

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

1..Net开源Json序列化工具Newtonsoft.Json中提供了解决序列化的循环引用问题: 方式1:指定Json序列化配置为 ReferenceLoopHandling.Ignore 方式2:指定 JsonIgnore忽略 引用对象 实例1,解决MVC的Json序列化引用方法: step1:在项目上添加引用 Newtonsoft.Json程序包,命令:Insert-Package Newtonsoft.Json step2:在项目中添加一个类,继承JsonResult,代码如下: ///

容易导致循环引用的场景的解决方案

一.Block block的内部引用了对象的属性或者方法,导致block保留了对象,同时对象又保留了block,形成循环引用. 解决方案是,在ARC中采用__weak对对象进行弱化,在非ARC中采用__block对对象进行弱化.如下: @property(nonatomic, readwrite, copy) completionBlock completionBlock; //======================================== __weak typeof(self

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

这个在单一classLoader时,不会有问题.如果多classloader下会有问题. 假设工程有两个模块,module2 依赖module1 当我们执行mvc eclipse:eclipse后,然后查看module2下的.classpath文件,会发现 : <classpathentry kind="src" path="/module1"/>. 如果module1中pom.xml,我们声明了一个第三方依赖(假设为 servlet-api)scope

常见的出现内存循环引用的场景有哪些?

定时器(NSTimer):NSTimer经常会被作为某个类的成员变量,而NSTimer初始化时要指定self为target,容易造成循环引用(self->timer->self). 另外,若timer一直处于validate的状态,则其引用计数将始终大于0,因此在不再使用定时器以后,应该先调用invalidate方法 block的使用:block在copy时都会对block内部用到的对象进行强引用(ARC)或者retainCount增1(非ARC).在ARC与非ARC环境下对block使用不当

进击的雨燕--------------自动引用计数

Swift 使用自动引用计数(ARC)机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 内存管理机制会一直起作用,你无须自己来考虑内存的管理.ARC 会在类的实例不再被使用时,自动释放其占用的内存. 然而,在少数情况下,ARC 为了能帮助你管理内存,需要更多的关于你的代码之间关系的信息.本章描述了这些情况,并且为你示范怎样启用 ARC 来管理你的应用程序的内存. 注意:引用计数仅仅应用于类的实例.结构体和枚举类型是值类型,不是引用类型,也不是通过引用的方式存储和传递. 自动引用计数的工

c++智能指针以及循环引用问题(转)

解决循环引用: 在知道存在循环引用的条件下,使用boost::weak_ptr,即弱引用来代替循环引用中的某个强引用,从而打破循环引用的环. 由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete,比如流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见,并造成内存泄露.如此c++引入 智能指针 . c++ 智能指针主要包括:unique_ptr,shared_ptr, weak_ptr, 这三种,其中auto

自动引用计数

http://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapter2/16_Automatic_Reference_Counting.html 本页包含内容: 自动引用计数的工作机制 自动引用计数实践 类实例之间的循环强引用 解决实例之间的循环强引用 闭包引起的循环强引用 解决闭包引起的循环强引用 Swift 使用自动引用计数(ARC)这一机制来跟踪和管理你的应用程序的内存.通常情况下,Swift 的内存管理机

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

转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52637333 背景:收到公众投稿,<从面试题中看Java的Reference(引用)>,分析的很不错,总感觉少了实际的例子和应用场景.于是结合自己工作中场景,小总结一下.看下Agenda如下: 强引用 软引用 弱引用 什么时候使用软引用,什么时候使用弱引用? 虚引用 一.强引用 Java中的引用,类似于C++的指针.通过引用,可

C++ 之引用

int argc ,char * argv[] - argument count & argument vector argc - 命令行参数个数,argv[]依次指向每一个命令行参数,其中argv[0]为程序名字:下面的程序包含了完整的程序路径. #include <iostream> int main(int argc, char *argv[]) { int i = 0; // begin with 0 while (i < argc) std::cout <<