1、Object-C 经历两个阶段: 1、手动引用计数内存管理(Manual Reference Counting,MRC) 2、自动引用计数内存管理(Automatic Refernce Counting,ARC)

2、引用类型 内存分配到 堆 上,需要人为管理。 值类型 内存分配到 栈 上,有处理器管理。

3、每个类创建的对象都有一个内部计数器,这个计数器跟踪对象的引用次数,成为 引用计数(Reference Count,简称 RC)。当对象被创建时候,引用计数为1,每次对象被引用的时候会是其引用计数加1,如果不需要的时候,对象引用断开(赋值 nil),其中引用计数 减1.当对象引用计数为 0 的时候,对象内存才被释放。

  备注:init(){}  类的构造方法中 会将实例与对象建立"强引用" 关系, deinit{} 析构方法 只有当引用计数为 0 时候才会执行。

4、强引用循环:

  当两个对象的存储属性相互引用对方的时候,一个对象释放的前提是对方先释放,另一个对象释放前提也是对象先释放,这样就会导致"死锁"的状态,导致内存泄露。

解决强循环 两种方式:1、弱引用 2、无主引用。

  弱引用:允许其中一个对象不采用强引用类型方式引用另外一个对象,这样就不会引起强引用循环问题。弱引用适合与 引用对象可以没有值的情况,因为弱引用可以没有值,我们必须讲一个弱引用 声明为可选类型,使用weak 声明弱引用。

  例如:员工A类 存储属性 部门, 部门B类  部门领导(员工), 如果部门可以没有 部门领导,那么可以将 B类 部门领导 属性 使用 weak 修饰, 那么A、B 之间不存在循环引用。

  无主引用:其中一个对象不采用强引用另外一个对象。无主引用适用于引用对象永远有值情况,它总是被定义为非可选类型,使用关键字unowned。

  例如:一个员工可以没有部门,一个部门必须有部门领导,那么可以将B类  unowned var manager :Employee ,建立无主引用。

5、lazy 修饰表示 延迟加载。 lazy var fullName:()->String={ return a+b} ,类的属性 可以在闭包中使用,必须使用 lazy 延迟加载,及所有属性初始化后,self表示对象才会被创建和使用。

6、闭包引用循环: 如果闭包与捕获对象总是相互引用并且总是同时销毁,则将闭包内的捕获声明为无主引用。

           当捕获的对象有可能为nil时,则将闭包内的捕获声明为 弱引用。如果捕获的对象绝对不会为nil,那么采用无业引用。

Swift 内存管理的更多相关文章

  1. Swift 内存管理详解

    Swift内存管理: Swift 和 OC 用的都是ARC的内存管理机制,它们通过 ARC 可以很好的管理对象的回收,大部分的时候,程序猿无需关心 Swift 对象的回收. 注意: 只有引用类型变量所 ...

  2. swift内存管理中的引用计数

    在swift中,每一个对象都有生命周期,当生命周期结束会调用deinit()函数进行释放内存空间. 观察这一段代码: class Person{ var name: String var pet: P ...

  3. Swift内存管理-示例讲解

    具体而言,Swift中的ARC内存管理是对引用类型的管理,即对类所创建的对象采用ARC管理.而对于值类型,如整型.浮点型.布尔型.字符串.元组.集合.枚举和结构体等,是由处理器自动管理的,程序员不需要 ...

  4. swift 内存管理,WEAK 和 UNOWNED

    因为 Playground 本身会持有所有声明在其中的东西,因此本节中的示例代码需要在 Xcode 项目环境中运行.在 Playground 中可能无法得到正确的结果. 不管在什么语言里,内存管理的内 ...

  5. Swift内存管理、weak和unowned以及两者区别

    Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配.当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存.而释放的原则遵循了自动引用计数 (ARC) 的规则:当一 ...

  6. Swift内存管理、weak和unowned以及两者区别(如何使用Swift 中的weak与unowned?)

    Swift 是自动管理内存的,这也就是说,我们不再需要操心内存的申请和分配. 当我们通过初始化创建一个对象时,Swift 会替我们管理和分配内存.而释放的原则遵循了自动引用计数 (ARC) 的规则:当 ...

  7. swift内存管理:值类型与引用类型

    Use struct to create a structure. Structures support many of the same behaviors as classes, includin ...

  8. swift内存管理

    为了解决引用循环的问题. However, with ARC, values are deallocated as soon as their last strong reference is rem ...

  9. Swift中的可选链与内存管理(干货系列)

    干货之前:补充一下可选链(optional chain) class A { var p: B? } class B { var p: C? } class C { func cm() -> S ...

随机推荐

  1. c# CTS 基础数据类型笔记

    C#中的基础数据类型并没有内置于c#语言中,而内置于.net freamework. C#有15个预定义类型,其中13个是值类型,两个是引用类型(string和object) 一.值类型 值类型 数据 ...

  2. CentOS7 修改网卡名称

    vi /etc/sysconfig/grub 增加net.ifnames=0 biosdevname=0 执行:grub2-mkconfig -o /boot/grub2/grub.cfg

  3. linux 下用户组、文件权限详解

    参考资料:http://www.cnblogs.com/123-/p/4189072.html

  4. 【Android开发日记】之入门篇(十二)——Android组件间的数据传输

    组件我们有了,那么我们缺少一个组件之间传递信息的渠道.利用Intent做载体,这是一个王道的做法.还有呢,可以利用文件系统来做数据共享.也可以使用Application设置全局数据,利用组件来进行控制 ...

  5. 编译环境搭建:Makefile

    前言 长久以来,笔者一直想用一种管理工具,将所编写的测试程序.算法代码以及工程代码统一管理起来.因为有些是用Java写的有些是用C++写的.虽有想法,但却无行动.这又让我想起了昨天晚上看到一部电影里所 ...

  6. 关于json中转义字符/正斜杠的问题。

    1.首先有关转义字符 可以看百度百科: 先不管/是否需要转义,我们去json的官方网站去看看:http://www.json.org/ 可见有这个,那么意思是 json中 又规定建议了一下,意思是虽然 ...

  7. C#中ASCII码与字符串的互换

    主要代码: int a = (int)'a';// 把字符直接转换为int类型,即可得到ASCII码值 ).ToString();// 将数字直接转换为char类型,即可得到ASCII码对应的字符 C ...

  8. hdu 4813(2013长春现场赛A题)

    把一个字符串分成N个字符串 每个字符串长度为m Sample Input12 5 // n mklmbbileay Sample Outputklmbbileay # include <iost ...

  9. #NodeJS 服务器基本模板

    基本server配置 cookie / session / get数据 / post数据 / 请求方法 const express=require('express'); const static=r ...

  10. python开发学习-day16(Django框架初识)

    s12-20160507-day16 *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: ...