• iOS学习之内存管理


    1.1 引用计数 Reference Count

    1.2 自动引用计数,ARCAutomatic Reference Counting

    1. 1引用计数

    引用计数(Reference Count)是一个简单而有效的管理对象生命周期的方式。当我们创建一个新对象的时候,它的引用计数为 1,当有一个新的指针指向这个对象时,我们将其引用计数加 1,当某个指针不再指向这个对象是,我们将其引用计数减 1,当对象的引用计数变为 0 时,说明这个对象不再被任何指针指向了,这个时候我们就可以将对象销毁,回收内存

    内存管理五种思考方式:

    • 自己生成的对象,自己持有(自生自持)
    • 非自己生成的对象,自己也能持有(非自生自持)
    • 不需要自己持有的对象释放
    • 非自己持有的对象无法释放
    • 不要向已经释放的对象发送消

    1. 自生自持

    用以下方法生成对象自己持有(计数加一)

    • allocnewcopymutableCopy
    • allocMyobjectnewThatObjectcopyThismutableCopyYourObject

    id obj=[NSObject alloc]init];(计数加1

    2. 非自生自持

    使用retain使非自生可自持

    Id obj=[NSMutableArray array];(计数不加1)

    [obj retain];(计数加1

     

    3. 不需要自己持有的对象释放

    使用allocnewcopymutableCopy或者retain方法持有的对象,一旦不需要,使用release方法释放

    [obj release];

     

    4. 非自己持有的对象无法释放

    Id obj=[obj0 object];

    [obj1 release]; (obj1没有自己持有,释放的话会造成程序异常崩)

    5. 不要向已经释放的对象发送消

    我们向一个已经被回收的对象发了一个 retainCount 消息,所以它的输出结果应该是不确定的,如果该对象所占的内存被复用了,那么就有可能造成程序异常崩

     

    自动释放池原理:

    调用release立刻将保留计数减1,还可能回收对象,使用authorelease,计数会在稍后1,通常是在下一次“事件循环”。在方法返回对象时很有用。

     

     

     

     

     

    2ARC

    1. 由于ARC是自动执行retain,release,autorelease,dealloc是不能调用的。
    2. ARC必须遵守的方法命名规则:

    alloc,new,copy,mutableCopy,开头的。其返回的对象规调用者所有。(自生自持)。

    1. ARC 管理对象生命的办法基本上就是:在合适的地方插入retain”,“release”操作。
    2. CoreFoundation对象不归ARC管理

     

    ARC 帮我们解决了引用计数的90%问题,但是还有 10% 内存管理,是需要自己处理

    需要自己维护这些对象的引用计数。

    对于问题主要体现在:

    1. 过度使用 block 之后,无法解决循环引用问题。
    2. 遇到底层 Core Foundation 对象,需要自己手工管理它们的引用计数时,显得一筹莫展。

    1. 循环引用(Reference Cycle)问

    1) 相互引用了对方作为自己的成员变

     

    解决方法:

    1. 主动断开循环引

    明确知道这里会存在循环引用,在合理的位置主动断开环中的一个引用。

    主动断开循环引用这种操作依赖于程序员自己手工显式地控制,相当于回到了以前谁申请谁释放的内存管理年代,所以这种解决方法并不常

     

     

    1. 使用弱引

    弱引用虽然持有对象,但是并不增加引用计数,这样就避免了循环引用的产

    两个 ViewController A BViewController A 需要弹出 ViewController B,让用户输入一些内容,当用户输入完成后,ViewController B 需要将内容返回给 ViewController A。这个时候,View Controller delegate 成员变量通常是一个弱引用,以避免两个 ViewController 相互引用对方造成循环引用问题。

     

    使用Xcode 的Instruments检测循环引

    Product -> Profile,然后选择 “Leaks”

    2. Core Foundation 对象的内存管

    对于 Core Foundation 对象,由于不在 ARC 管理之下,我们仍然需要延续以前手工管理引用计数的办

    • CFRetain 和 CFRelease 两个方法,读者可以直观地认为,这与 Objective-C 对象的 retain 和 release 方法等价。

    所以对于底层 Core Foundation 对象,我们只需要延续以前手工管理引用计数的办法即可。

    这就引入了bridge相关的关键字,以下是这些关键字的说明

    • __bridge: 只做类型转换,不修改相关对象的引用计数,原来的 Core Foundation 对象在不用时,需要调用 CFRelease 方法
    • __bridge_retained:类型转换后,将相关对象的引用计数+ 1,原来的 Core Foundation 对象在不用时,需要调用 CFRelease 方法
    • __bridge_transfer:类型转换后,将该对象的引用计数交给 ARC 管理,Core Foundation 对象在不用时,不再需要调用 CFRelease 方法
  • 相关阅读:
    本地服务器连接不上解决过程!!!
    delete语句与reference约束 FK_subplan_job_id冲突问题,导致job无法删除解决办法
    设置手动批量删除数据库相关进程
    生成10位由大小写字母和数字组成的随机激活码
    修改表中某个字段区分大小写
    SQL获取时间戳流水号
    TypeError: Object(...) is not a function
    vue 中使用setTimeout
    Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 1; columnNumber
    微信小程序 指定tabBar打开某个tab
  • 原文地址:https://www.cnblogs.com/bzhong/p/5974847.html
Copyright © 2020-2023  润新知