MRC和ARC

原创 2016年05月30日 17:00:43

MRC

Manul(手动) Reference(引用) Counting(计数)

什么是手动引用计数?
通过release和retain手动管理程序的内存

内存管理的原则就是有加就有减
也就是说, 一次alloc对应一次release, 一次retain对应一次relese

多个对象的内存管理

当B对象成为A对象的属性时,A对象要对B对象进行一次retain确保B对象是存在的 当A对象释放时,要对所持有的对象属性进行release,避免内存泄露
这里写图片描述

自动释放池

方法一

    @autoreleasepool {

       Person *p = [[Person alloc] init];
       p = [p autorelease];  // 标记p加入释放池
       [p run];

       //写法2
       Person *p = [[Person alloc] init] autorelease]; 
       [p run];

    } //被标记的对象 自动释放池会自动发送release

方法二

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    Person *p = [[[Person alloc] init] autorelease];
    [p run];

    // 销毁一个自动释放池
    [pool release];

一个程序中可以创建N个自动释放池, 并且自动释放池还可以嵌套
如果存在多个自动释放池的时候, 自动释放池是以 “栈” 的形式存储的
栈的特点: 先进后出

     给一个对象方法发送一条autorelease消息, 永远会将对象放到栈顶的自动释放池
    @autoreleasepool {  创建第一个释放池
        @autoreleasepool {  创建第二个释放池
            @autoreleasepool {  创建第三个释放池
                Person *p = [[[Person alloc] init] autorelease];
                [p run];
            }  第三个释放池销毁

            Person *p = [[[Person alloc] init] autorelease];

        } 第二个释放池销毁
    } 第一个释放池销毁

Foundation框架的类, 但凡是通过类工厂方法创建的对象都是autorelease的

        Person *p = [[[Person alloc] initWithAge:30] autorelease];

        Person *p2 = [[Person person] autorelease];

ARC

Automatic(自动) Reference(引用) Counting(计数)

什么是自动引用计数?
不需要程序员内存, 编译器会自动添加release/retain等代码

注意点: OC中的ARC和java中的垃圾回收机制不太一样, java中的垃圾回收是系统干得, 而OC中的ARC是编译器干得

  • 僵尸对象: 被释放了的对象
  • 野指针:指向了僵尸对象的指针
    为了避免给野指针发送消息会报错, 当一个对象被释放后会设置为空指针(在OC中给空指针发送消息是不会报错的

ARC的判断准则

ARC的判断准则: 只要没有强指针指向对象, 对象就会释放
默认情况下所有的指针都是强指针

// 强指针
__strong Person *p = [[Person alloc] init];
// 弱指针
__weak Person *p2 = p;
p = nil;

property修饰符

iOS开发中只要写上property, 那么就立刻写上nonatomic

readonly: 只会生成getter方法
readwrite: 既会生成getter也会生成setter,
getter: 可以给生成的getter方法起一个名称
setter:可以给生成的setter方法起一个名称
retain: 就会自动帮我们生成getter/setter方法内存管理的代码
assign: 不会帮我们生成set方法内存管理的代码, 仅仅只会生成普通的getter/setter方法, 默认什么都不写就是assign
多线程 atomic :性能低(默认)
nonatomic :性能高 在iOS开发中99.99%都是写nonatomic

@class

应用场景一

1.如果都在.h中import, 假如A拷贝了B, B拷贝了C , 如果C被修改了, 那么B和A都需要重新拷贝. 因为C修改了那么B就会重新拷贝, 而B重新拷贝之后相当于B也被修改了, 那么A也需要重新拷贝. 也就是说如果都在.h中拷贝,只要有间接关系都会重新拷贝
2.如果在.h中用@class, 在.m中用import, 那么如果一个文件发生了变化, 只有和这个文件有直接关系的那个文件才会重新拷贝
3.所以在.h中用@class可以提升编译效率

应用场景二

防止循环引用, (A拷贝B, B拷贝A)
如果在.h中用@class, 不会做任何拷贝, 而在.m中用import只会拷贝对应的文件, 并不会形成死循环

版权声明:本文为博主原创文章,未经博主允许不得转载。

ARC和MRC下的block的内存分布详解

Block有三种类型,分别是 __NSGlobalBlock__:全局Block,程序被加载后被分配在进程数据段上(类似函数,位于text段),也就是常量,静态创建的Block。 __NSMall...

oc——类——MRC ARC

RC reference counting,引用计数,instance object内存管理机制,表示instance object被多少个指针引用或拥有 RC = 0时,instance obje...
  • mardax
  • mardax
  • 2017年03月20日 23:27
  • 90

iOS学习笔记01——在工程中实现ARC和MRC混合编译

接触iOS差不多有一年的时间了,从大四开学后开始自学起步,这一路走过来,都是看着前辈们的博客和苹果官方的开发者文档(虽然我的英文水平一般)。今年(2013)7月份正式从学校毕业了,到现在差不两个月的试...

iOS的ARC/MRC单例模式

1.单例模式 1.1 概念相关 (1)单例模式在程序运行过程,一个类只有一个实例(2)使用场合在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次) 1.2 ARC实现单例 (1)步骤01 在...

iOS内存管理:从MRC到ARC实践

对于iOS程序员来说,内存管理是入门的必修课。引用计数、自动释放等概念,都是与C语言完全不同的。搞明白这些,代码才有可能不 crash。然而就是这么牛逼的内存管理,着实让我这个从 C 转过来的老程序员...

iOS——在ARC下引入MRC文件

在写一些工程时我们总是要引入一些第三方文件,但是这些文件有些是ARC下的有些是非ARC下的。所以我们要进行转换。 引入三方文件时首先要阅读引入的文件的.h 文件头部信息 如下面的文件:头部文件要求:H...
  • zzzzhy
  • zzzzhy
  • 2016年05月10日 13:06
  • 1670

Objective-c的内存管理MRC与ARC

转自:http://blog.csdn.net/fightingbull/article/details/8098133 Objective-c中提供了两种内存管理机制MRC(Man...

MRC转ARC注意事项和存在的问题

转载请注明出处: 1.删除所有retain,release和autorelease。 2.把原来property写retain和assign的地方替换成strong或者weak. 3.MRC...
  • CyWn_d
  • CyWn_d
  • 2014年01月13日 15:34
  • 2042

【Bugly干货分享】iOS内存管理:从MRC到ARC实践

Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处。对于iOS程序员来说,内存管理是入门...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MRC和ARC
举报原因:
原因补充:

(最多只允许输入30个字)