OC学习笔记之OC内存管理

内存管理入门

1.为什么进行内存管理


  移动设备的内存有限,一般在超过20M的时候回告警,45M的时候回再次告警,110M的时候回自动程序崩溃,保证其他程序的正常运行。--------告警是告诉程序回收一些不在使用的对象和变量等,否则程序会崩溃

2.内存管理的范围

内存管理的范围及计数引用

内存管理的范围:
    所有继承自NSObject对象的内存管理

对象的所有权及引用计数:
    1.一个对象可以有一个或者多个所有者。当该对象的所有者的数目为0的时候,该对象才会被被释放
    2.在每个对象的内部,都有一个8个字节的存储空间,该空间用来存储引用计数器retaincount。
    3.引用计数器的作用:判断对象要不要回收的依据。如果retaincount是0的话就回收空间。存在一种例外----对象值
       为nil时,引用计数为0,但是不回收空间
    4.引用计数器的操作
       (1)retain消息:使retaincount+1,该方法返回对象本身
       (2)release消息:使retaincount-1,
       (3)retainCount消息:获得对象当前的引用计数器的值
       
对象的销毁:
    当对象的引用计数器的值为0时,该对象销毁,其占用的内存被系统回收。
    当对象被销毁时,系统自动向对象发送一条dealloc消息,释放资源---------一般会重写dealloc方法,但是,重写
         dealloc方法必须调用[supser dealloc],并且放在代码块的最后调用
    一旦对象被回收,那么他所占据的存储空间不再可用,否则出现野指针错误

内存管理的分类:
    1.MannulReference Counting----------MRC(手动管理),与ARC不同的时,空间的回收由程序猿手动回收。
    2.automatic reference counting---------ARC(自动管理)
    3.garbage collection---------垃圾回收,IOS不支持


指针的内存管理

单个对象野指针问题产生的原因:
     代码段:
         Dog *byd = [Dog new];//retaincount=1
         [byd eat];
         [byd release];                //retaincount=0
         [byd eat];                     //按道理说是不能执行的,引用空间已经被释放了。但是可以运行呢
     原因:当rataincount=0的时候,系统释放对象的空间,所谓的释放就是说,其他的对象或者程序可以
              使用这些内存。但是如果,没有程序占用这些内存,[byd eat]还是可以使用得(OC并没有那么严谨);
              如果一个对象被释放了,但是释放之后,还是被引用了,那么这就是僵尸对象。


解决办法:
     开启僵尸对象检测

   

nil,nil,NULL,NSnull的简单接受
    nil----用于对象,如果对象没有被赋值,那么他就是nil。
    Nil---给类对象赋值。
    NULL----指针为空。
    NSnull----适用于不能使用nil的场合,例如数组。


单个对象避免使用僵尸对象的方法:
    [d release];                                         [d release];
    d = nil;-------------------相当于    d = nil;
    [d eat];                                               [nil eat];
    对nil的任何操作都是无效的。

单个对象内存泄露的情况分析:
    1、对象创建完成之后,没有release
    2、没有遵守内存管理原则
          谁申请的谁release
    3、nil的不当使用
         Dog *d =[[Dog allloc] init];
         d = nil;
         [d eat];
         [d release];
    4、Dog *d =[[Dog allloc] init]
         [d method:d];
         其中method:d方法中使得d的retain+1;


多对象出现野指针问题的原因分析:
    对象A调用对象B的方法,当对象B释放之后,A并没有感知,依旧会调用B的方法,但是B已经不存在了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值