zoukankan      html  css  js  c++  java
  • OC中的自动引用计数

    目录:

    1,自动引用计数的定义

    2,强引用和弱引用

    3,类比手动引用

    4,循环引用

    5,CoreFoundation

    内容:

    自动引用计数的定义:

    (Automatic Reference Counting) 在编译时自动在合适的位置加入retain 和 release,简化内存管理,自动引用计数不是内存管理,而是通过强引用(__strong)和弱引用(__weak)指针来标记内存的管理方式,当指向对象的强引用指针数等于0时,内存才会释放。

    强引用和弱引用:

    __strong, 当我创建一个oc类型时,默认的就是strong.

    __weak, 当weak类型的指针指向的对象被释放后,指针会自动设置成nil.

    注意:assign修饰的属性时,功能类似于weak,但其对象被释放后不会设置成nil. 还有retain相当于strong,但是用于手动计数。

    类比手动引用:

    在自动引用计数里,我不能手动调用dealloc,retain, release, autorelease 和 retainCount.

    循环引用:

    自动引用计数不是万能的,当出现循环引用时,内存不会被释放,比如当定义了两个类型A 和 B,A中的某个属性指向B的对象,B中的属性指向A的对象,当我们完成相关逻辑后,把A和B的对象设置成nil,这时你会发现两个对象并没有被释放,这时我应该把其中一个类的属性设置成weak,assign 或 unsafe_unretained.

    相关的控制权如下:

    • assign implies __unsafe_unretained ownership.
    • copy implies __strong ownership, as well as the usual behavior of copy semantics on the setter.
    • retain implies __strong ownership.
    • strong implies __strong ownership.
    • unsafe_unretained implies __unsafe_unretained ownership.
    • weak implies __weak ownership.

    CoreFoundation:

    自动引用计数只能管理oc对象,对CoreFoundation里的对象就无能为力了,但有另外一些规则:

    __bridge  - OC 和 CF对象可以相互转换,但不影响引用,就是说控制权没有转移。

    __bridge_retained - OC转成CF对象,CF管理内存 (CFRelease)

    __bridge_transfer - CF转成OC对象, OC管理内存

  • 相关阅读:
    spring
    redis
    CentOS 6 安装教程(转载)
    Ajax&JSON
    课时2:RequestMapping映射及个属性
    课时1:SpringMVC环境搭建及第一个程序
    课时2:Spring整合MyBatis的几种方式 前面一个课时已经讲了一种思路了
    课时1:Spring整合MyBatis思路
    课时14:Bean的生命周期,通过import引入分散的spring文件
    课时13:作用域
  • 原文地址:https://www.cnblogs.com/zhifu/p/4722876.html
Copyright © 2011-2022 走看看