zoukankan      html  css  js  c++  java
  • 12月21号 内存管理

    1.什么是内存管理

      程序在运行过程中管理内存分配的过程,当需要内存的时候就申请一片内存空间,不需要就释放掉


    2.如何去管理内存

      站在分配对象拥有权的角度来操作内存


    3.内存管理的两种方法

      a.MRR(Manual Retain Release)手动管理,实现的机制:reference counting 引用技术机制

      b.ARC(Automatic Reference Counting)自动引用计数,实现的机制:系统在程序编译阶段自动添加了释放对象的方法。


    4.引起内存错误的两种情况

      a.释放掉一个正在使用的对象

      b.不用的对象没有释放掉,导致内存错误


    5.内存管理的基本原理

      a.使用alloc new copy mutableCopy开头的方法的创建的对象  就有拥有权,就应该负责释放

      b.不是自己创建的对象,但是又想获得这个对象的拥有权,可以使用retain(属性的setter方法和init方法)

      c.当一个对象不再使用了,就应该释放掉自己的那份拥有权(release   autorelease)

      d.不能去释放一个自己没有拥有权的对象


    6.可以使用autorelease来实现延迟释放,使用场合(在一个方法里面返回一个对象)

    -(NSString *)fullname{

      NSString *string = [[[NSString alloc] initWithFormat:@"%@:%@",self.name,self.address]autorelease];

      return string;

    }

    -(void)printFullname{

      NSString *temp = [self fullname];

      NSLog(@"%@",temp);

    }


    7.release 和autorelease的区别

      a.release是立刻释放  autorelease是延迟释放

      b.release的优点:可以立刻释放内存

         autorelease的优点:可以延迟释放,操作方便,出错概率小。在某一段时间内内存是增加的。

      c.企业里面的使用习惯:autorelease


    8.如何释放掉一个对象本身拥有的资源

      通过在类的实现文件(.m)里面重写父类的dealloc方法来实现释放一个对象本身拥有的资源

      a.dealloc方法是当这个对象的拥有者为0,那么系统会自动调用对象的dealloc方法,不能注定去调用

      b.在dealloc方法里面,先释放掉自己对象的拥有权,然后再调用[super dealloc]释放自己


    9.实际操作

      a.尽量使用访问器方法来操作属性变量(self.name)

      b.在dealloc方法里面尽量不要使用访问器方法


    10.retain  cycle

      A对象里面拥有B对象,B对象里面拥有A对象,当A要释放掉自己的时候,必须等B对象释放掉自己对A的拥有权

      B对象要释放掉自己的时候,必须等A对象释放对自己的拥有权,所以两者都释放不了

      解决方案:

        大的强引用小的(retain strong)小的弱引用大的(weak)


    11.不能使用retainCount去查看一个对象的拥有者,只能自己确保代码是按照内存管理的原理来操作的就OK了

  • 相关阅读:
    poj 3243 Clever Y(BabyStep GiantStep)
    poj 2417 Discrete Logging
    poj 3481 Double Queue
    hdu 4046 Panda
    hdu 2896 病毒侵袭
    poj 1442 Black Box
    hdu 2815 Mod Tree
    hdu 3065 病毒侵袭持续中
    hdu 1576 A/B
    所有控件
  • 原文地址:https://www.cnblogs.com/hmzxwky/p/5063468.html
Copyright © 2011-2022 走看看