<center>oc内存管理机制<:center>

详谈OC内存管理

概念


为什么要进行内存管理

  因为移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等。

内存管理类型

  基础类型,如:int,float,char,bool,byte...等(内存在栈上,系统管理)
  对象类型:继承于NSObjiect类的对象都属于对象(内存在堆上,人为管理)
OC中管理的内存是对象类型

内存管理原则

  每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象被销毁,该对象所占内存被释放。
  当对象被销毁时,系统会自动调用delloc,因此当销毁对象时,可以将该对象的属性的释放写在dealloc方法里面,且[super dealloc]应当写在所有[对象.属性 release]之后;原因:一旦对象被回收了,那么他所占据的存储空间就不再可用,他的属性指针会导致程序崩溃(野指针错误)。

内存管理方式

MRC手动管理内存

   OC内存管理遵循 谁创建,谁释放,谁引用,谁管理的机制即当创建或引用一个对象的时候,需要向它发送alloc、copy、retain消息,这都使得对象的引用计数+1,当释放该对象时需要发送release消息,这都使得对象的引用计数-1,当对象引用计数为0时,系统将释放该对象,这是OC的手动管理机制(MRC)。

ARC自动管理内存

  ARC管理机制与手动机制一样,只是不再需要调用retain、release、autorelease;它编译时的特性,当你使用ARC时,在适当位置插入release和autorelease;它引入strong和weak关键字,strong修饰的指针变量指向对象时,当指针指向新值或者指针不复存在,相关联的对象就会自动释放,而weak修饰的指针变量指向对象,当对象的拥有者指向新值或者不存在时weak修饰的指针会自动置为nil。

autorelease以及autorelease pool

  向一个对象发送一条autorelease消息,这个对象并不会立即销毁, 而是将这个对象放入了自动释放池autorelease pool(每个runloop默认创建一个autorelease pool),待池子释放时,它会向池中每一个对象发送 一条release消息,以此来释放对象.
  在ARC下没有autorelease关键字,在大量创建对象后可以将对象放入@autoreleasepool代码块中,可以提升性能.

循环引用

循环引用在于形成一个环,两个或多个对象相互引用,导致内存释放不掉,从而产生内存泄漏的问题.

常见场景

NStimer
由于创建NSTimer指定target为self,即当前NSTimer保留了当前类,又因为NStimer属于当前类的属性,导致两者循环引用,都释放不掉.
解决办法:要释放类之前让定时器失效并将指针赋空即[_timer invalidate];_timer = nil;
bolock
block也会常常出现循环引用问题,例如:
  self.arr = @[@111, @222, @333];
    self.block = ^(NSString *name){
        NSLog(@"arr:%@", self.arr);
        }
  上述代码因为block是self的属性,又因block内部包含self导致循环引用
解决办法:ARC中将上述代码改为:
self.arr = @[@111, @222, @333];    
    _ _weak typeof(self) weakSelf=self;
     self.block = ^(NSString *name){
         NSLog(@"arr:%@", weakSelf.arr);
     };       
     在MRC中把_ _weak换成_ _block
委托delegate
 因为对象.delegate=self和self.对象会导致循环引用
 解决办法:设置对象的delegate时使用assign修饰使其引用时引用计数不加1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值