• 内存管理


    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.开辟一个新的线程

  • 相关阅读:
    [HDOJ1800]Flying to the Mars
    [HDOJ5058]So easy
    HDU 2819 — Swap 二分匹配
    POJ1236
    Codeforces Round #267 (Div. 2) C. George and Job DP
    codeforces Round #263(div2) D. Appleman and Tree 树形dp
    HDU 4345 Permutation dp
    HDU 4349 Xiao Ming's Hope lucas定理
    HDU 4342History repeat itself 数学
    HDU 4341 分组背包
  • 原文地址:https://www.cnblogs.com/huoran1120/p/5063498.html
Copyright © 2020-2023  润新知