内存管理

1.内存管理:程序在运行中管理内存分配的过程,当需要就申请一片内存,不用就释放掉,站在对象分配所有权的角度来分配内存。

2.内存管理的两种方法

  MRR(Manual Retain Release)手动-------reference counting 引用计数机制

  ARC  (Automatic Reference counting)自动-------系统在程序编译阶段自动添加了释放对象的方法。

3.引用计数器:(我们无法查看结果,但是如果我们按照规范来书写,那么是没有问题的)

  When you create an object, it has a retain count of 1.

  When you send an object a retain message, its retain count is incremented by 1.

  When you send an object a release message, its retain count is decremented by 1.

  When you send an object a autorelease message, its retain count is decremented by 1 at the end of the current autorelease pool block.

  If an object’s retain count is reduced to zero, it is deallocated.

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

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

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

5.RULES

  • You own any object you create

    享有自己创建的对象的拥有权--new,alloc,copy 应该负责释放

  • You can take ownership of an object using retain

    对已经有的对象声明拥有权--strong,retain(通过setter方法和init方法)

  • When you no longer need it, you must relinquish ownership of an object you own

    当长时间没有使用必须释放掉拥有权--release,autorelease

  • You must not relinquish ownership of an object you do not own

    不能去释放一个没有拥有权的对象

6.autorelease与release的区别

  release是立刻释放

  autorelease是延迟释放(系统)

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

    企业习惯用 autorelease  因为操作方便出错概率小,一段时间内内存是增加的,牺牲了内存维护了代码的健壮性。

7.释放掉对象本身拥有的资源

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

  -(void)dealloc

  {

    [_car release];   //先释放掉自己对象的拥有权

    [super dealloc];   //然后再调用[super dealloc]释放自己

  }

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

8.retain cycle

  A对象拥有B对象,B对象拥有A对象

  当A要释放自己的时候,必须等B对象释放对自己的所有权

  当B要释放自己的时候,必须等A对象释放对自己的所有权

                   

  解决方法:大强引用小的,小弱引用大的

 9.重写setter方法

-(void)setName:(NSString *)name{

    if (_name != name) {

        [_name release];

        _name =[name retain];  //property(  ,strong)重写的时候必须加

    }

}

10.autorelease pool三种情况要写

  a.当创建一个非UI的工程,需要自己写

  b.在一个循环里面会产生大量的临时对象

  c.开辟一个新的线程

原文地址:https://www.cnblogs.com/huoran1120/p/5063498.html