arc无法管理的情况

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对象释放语句,如果没去释放,也会造成内存泄露。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,612评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,142评论 1 32
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,775评论 0 9
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 4,348评论 0 11
  • 《此生未完成》,感动。万分感动,钦佩。作者能在生命的最后时期保持难得的乐观心态,留下这么多可贵的文字,没有太过悲伤...
    郑红阅读 343评论 0 1