美文网首页
ios - 内存管理机制

ios - 内存管理机制

作者: Fat_Blog | 来源:发表于2020-10-01 22:50 被阅读0次

    内存管理

    • 当我们创建对象,变量,调用方法时,程序都会给它们分配一定的内存
    • 而栈(stack)里一般存放的是值变量(如int,double,enum等等),栈里面的内存是由系统管理的,也就是说内存是由系统自动分配释放的,栈采取的是先进后出的原则来进去插入删除操作
    • 而堆(Heap)上一般存放的是OC对象,这部分需要程序员自己分配,自己释放,堆采取的是优先级高低来进行插入删除的,比如释放内存时一般从优先级高的开始释放
    • 程序员需要去管理堆空间的内存,不然程序的内存过大时,程序会出现崩溃,闪退等现象,极其影响用户的体验

    内存管理模式

    • 手工引用计数和自动释放池(MRC)
    • 自动引用计数(ARC)

    MRC模式下的内存管理

    引用计数器

    • 每个对象被创建时都会有自己的引用计数器,当引用计数器为0时,对象会被系统回收
    • 引用计数器可以理解为“当前有多少人正在引用当前对象“
    • p对象被创建时,引用计数器默认为1,调用[p retain]时计数器加一,调用[p release],计数器减一
    • 对象的引用计数为0时,系统会释放当前对象,同时会调用dealloc方法,在MRC模式下 ,如果重写dealloc方法,要带上[seper dealloc],在ARC模式下则不需要

    自动释放池

    • 当把对象扔进自动释放池里,就不用再去管对象的引用计数器,释放池可以统一释放掉池里的对象
    //创建自动释放池
    NSAutoreleasePool *autoreleasePool = [[NSAutoreleasePool alloc] init];
    将对象p加入到自动释放池中
    Person *p = [[[Person alloc] init] autorelease];
    //销毁自动释放池
    [autoreleasePool drain];
    

    ARC模式

    • ARC模式下不需要理会对象的引用计数器,它是根据对象有没有被强指针引用来决定是否会被系统自动销毁
    • 在ARC模式下,如果要重写dealloc方法,不需要在方法里面加入[super dealloc]

    相关文章

      网友评论

          本文标题:ios - 内存管理机制

          本文链接:https://www.haomeiwen.com/subject/muevuktx.html