美文网首页
arc无法管理的情况

arc无法管理的情况

作者: 雷3雷 | 来源:发表于2018-09-13 18:49 被阅读11次

Block的循环引用

循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。这个时候self强引用了block,而在block中使用self也会强引用self。这样就会产生循环引用,导致两个对象都得不到释放。

self.myBlock = ^{    [selfdoSomething];  };

解决的方法:掐断其中的一条强引用,使之变成弱引用,变成这样,就打破了循环引用:

__weaktypeof (self) weakSelf =self;

NSTimer未释放

在使用 NSTimer addtarget 时,为了防止 target 被释放而导致的程序异常,timer 会强引用 target,所以这也是一处内存泄露的隐患。解决方法是使用线程安全的MSWeakTimer,然后在dealloc中主动调用invalidate

- (void)dealloc {[timer invalidate];}

performSelector 系列

performSelector分静态调用和动态调用,以下这种调用 selector 的方法和直接调用 selector 基本等效,执行效果相同,不存在内存泄露

[object methodName];[object performSelector:@selector(methodName)];

还有一种动态绑定方式,编译器不知道即将调用的 selector 是什么,不了解方法签名和返回值,甚至是否有返回值都不懂,所以编译器无法用 ARC 的内存管理规则来判断返回值是否应该释放。因此,ARC 采用了比较谨慎的做法,不添加释放操作,即在方法返回对象时就可能将其持有,从而可能导致内存泄露。在ARC下编译会告警: 

warning: performSelector may cause a leak because its selector is unknow [-Warc-performSelector-leak]

-(void)method:(SEL)selector{

    [object performSelector:selector];

解决方式是使用函数指针,显示的声明这个函数

IMP imp = [viewController methodForSelector:selector];void(*func)(id, SEL) = (void *)imp;func(viewController,selector);

Delegate循环引用

把delegate声明为strong属性导致了循环引用

@property(nonatomic,strong) SampleViewController *delegate;

解决方法很简单把strong改成weak就行

@property(nonatomic,weak) SampleViewController *delegate;

循环未结束

如果某个ViewController中有无限循环,也会导致即使ViewController对应的view关掉了,ViewController也不能被释放。这种问题常发生于animation处理。

CATransition *transition = [CATransition animation];transition.duration=0.5;tansition.repeatCount= HUGE_VALL;[self.view.layeraddAnimation:transition forKey:"myAnimation"];解决办法是,在ViewController关掉的时候,停止这个animation

-(void)viewWillDisappear:(BOOL)animated {    [self.view.layerremoveAllAnimations];}

非OBJC对象

ARC是自动检测OBJC对象的,非objc对象就无能为力了,比如C或C++等。 

C语言使用 malloc 开辟,free释放。 

C++使用new 开辟,delete释放。 

但是在ARC下,不会添加非OBJC对象释放语句,如果没去释放,也会造成内存泄露。

相关文章

  • arc无法管理的情况

    Block的循环引用 循环引用就是当self 拥有一个block的时候,在block 又调用self的方法。这个时...

  • iOS 内存管理、查找循环引用

    内存管理 1、ARC 下的内存管理 循环引用 如图,就是循环引用的情况,A、B 互相引用无法释放。 造成循环引用的...

  • Swift ARC (引用&循环引用的造成及解决方案)

    ARC简介 ARC负责跟踪和管理应用程序的内存状态,一般情况下不需要考虑内存管理问题,当一个实例不再需要时,ARC...

  • iOS之ARC和循环引用

    ARC简介 Swift使用ARC(自动引用计数)来跟踪和管理应用程序的内存使用情况。大多数情况下,您不需要自己考虑...

  • Swift 中的自动引用计数

    ARC Swift 使用自动引用计数(ARC)来跟踪并管理应用使用的内存。大部分情况下,这意味着在 Swift ...

  • iOS夯实:ARC时代的内存管理

    iOS夯实:ARC时代的内存管理 iOS夯实:ARC时代的内存管理

  • 通讯录 与 发送邮件---iOS

    通讯录 AddressBook框架 基于C语言,无法使用ARC来管理内存,需要开发者自己管理内存 AddressB...

  • iOS系统复习(二) 内存Memory

    一、 内存管理 1 管理方式:MRC(已经很少用) ARC(常用)ARC:称为自动引用计数,ARC是iOS5推出的...

  • 内存管理

    内存管理方案:ARC MRC。我们现在都是ARC ARC是LLVM和Runtime配合的结果,ARC中禁⽌⼿动调⽤...

  • Swift-ARC(Automatic Reference Co

    Swift管理内存方式和OC极其相似,都是采用自动引用计数 ARC机制来跟踪和管理。ACR 会在实例不再使用的情况...

网友评论

      本文标题:arc无法管理的情况

      本文链接:https://www.haomeiwen.com/subject/cdrhjftx.html