zoukankan      html  css  js  c++  java
  • OC的内存管理(二)ARC

    指针:            指向内存的地址
    指针变量           存放地址的变量
    指针变量值          变量中存放的值(地址值)
    指针变量指向的内存单元值   内存地址指向的值
    1
    ):强指针:默认的情况下,所有的指针都是强指针,关键字strong 2):弱指针:__weak关键字修饰的指针 声明一个弱指针的格式: __weak Person *p;

    ARC概念

    1 Automatic Reference Counting,自动引用计数,即ARC,也可以说是WWDC2011和IOS5所引用的最大的变革和最激动人心的变化。ARC是新的LLVM3.0编译器的一项特性,使用ARC,可以说一举解决了广大IOS开发者所憎恨的手动管理内存的麻烦
    2 在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和autorelesase三个关键字就可以~这是ARC的基本原则
    3 在ARC开启时,编译器将自动在代码何时的地方插入retain,release 和autorelease,而作为开发者,完全不需要担心编译器会做错(除非开发者自己错用ARC了)
    4 手动管理内存,可以简称MRC(Manual Reference Counting)
    5 ARC与其他语言的"垃圾回收"机制不同,ARC:编译器特性:"垃圾回收"运行时特性

    ARC的工作原理

    1 ARC是Objective-C 编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做得只不过是在代码编译时为你自动在合适的位置插入release或autorelease

    ARC的判断准则;

    1 只要没有强指针引向对象,对象就会被释放
    2 注意:当使用ARC的时候,暂时忘记"引用计数器",因为判断标准变了

    如何判断当前是否处于ARC中?

    1 1.IOS5以后,创建项目默认的都是ARC
    2             ALL ----leveles  检索 auto 可以看到 Objective-C Automatic Referece Counting 是否是 yes
    3 2.ARC机制下有几个明显的标志:
    4     1)不允许调用对象的release方法
    5     2)重写dealloc方法的时候,不能使用 [super dealloc];
    6     3)不允许调用autorelease方法

    ARC下单对象内存管理

     1 1.在ARC下没有强指针引用是否会实时的立即被释放?
     2      会,只要没有强指针引向,立刻马上的被释放掉
     3 例:
     4     Car *car =[[Car alloc]init];
     5     //对象有没有被释放?
     6     car=nil;
     7     //会不会报错?
     8     car.speed = 10;
     9 
    10     1).会被释放,car被赋值为nil ,原来在堆区的空间没有强指针指向,内存空间会被释放
    11     2).不会报错---->为什么?
    12        car.speed---->[car setSpeed:10];
    13        当car =nil;
    14         [nil csetSpeed:10] ;所以不会报错 //给nil发送任何消息都不会报错
    15          
    16 
    17 2.强弱指针
    18     1)强指针
    19          所有的指针默认就是强指针
    20          强指针使用__strong 标示
    21     2)弱指针
    22          用__weak修饰的指针变量,都是弱指针
    23         //car 强指针 car2弱指针  两者指向相同的内存空间
    24         __weak Car *car2 = car;    
    25         car2 =nil;//不会是释放内存

    ARC下多对象内存管理

    ARC下循环引用的问题

    1 如果是两个对象循环引入,那么只要将其中的一个设置为weak 弱指针就可以避免无法释放的问题

    ARC下 @property参数

    1 ARC中的@property
    2 strong: 用于OC对象,相当于MRC总的retain
    3 weak:用于OC对象,相当于MRC的assign
    4 assign: 用于基于数据类型,跟MRC中的assign一样
    5 copy: 一般用于NSString,跟MRC中的copy一样
    6 在ARC情况下解决"循环retain"的问题:@property 一边用strong,一边用weak;

    ARC特点总结

    1 1)不允许调用release,retain,retainCount
    2 2)可以重写dealloc,但是不允许调用[super dealloc];
    3 3)@property的参数
    4     Strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
    5     Weak:相当于原来的assign,(适用于OC对象类型),成员变量是弱指针
    6     Assign:适用于非OC对象类型(基础类型)

    ARC使用注意事项

    1 1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作
    2 2)__weak Person *p =[[Person alloc]init];//不可以,对象一创建出来就被释放掉了,对方释放后,ARC把指针自动清零
    3 3)ARC中的property处不再使用retain,而是使用strong,在dealloc中不需要在[super dealloc]
    4     @perperty(nonatomic,strong)Dog *dog;
    5      //意味着生成的成员变量_dog是一个强指针,相当于以前的retain
    6 4)如果换成是弱指针,则换成weak,不需要加__;

    ARC模式下如何兼容非ARC的类

    1 让程序兼容ARC和非ARC部分。
    2          -转变为非ARC -fno-objc-arc 
    3          -转变为ARC的, -f-objc-arc

    MRC 转换成ARC

    转换之前记得先备份文件

  • 相关阅读:
    栈的理解(出、入栈)
    javascript实现可以拖动的层示例(层拖动,兼容IE/FF)
    C# 队列 堆栈
    从0开始做Windows Phone 7开发
    C#写系统日志
    一位软件工程师的6年总结
    向Android模拟器发短信打电话
    office2010激活方法
    常用正则表达式
    JaveScript获得鼠标位置
  • 原文地址:https://www.cnblogs.com/developer-wang/p/4505371.html
Copyright © 2011-2022 走看看