自动引用计数

引用类型(类、函数、闭包) 当声明一个变量指向某个引用类型时 当前引用类型的引用计数就会加1 当变量不指向该类型时 引用类型就会 -1

当引用计数为0时  当前引用类型就会被系统回收

import UIKit

class Author {

    var name: String

    var video: Video?

    init(name: String) {

        self.name = name

    }

 

    deinit {

        print("Author 被销毁了")

    }

}

 

class Video {

    var at: Author?

    init(author: Author?) {

        at = author

    }

 

    deinit {

        print("Video 被销毁了")

    }

}

 

class ViewController: UIViewController {

     var author: Author?

     var video: Video?

    override func viewDidLoad() {

        super.viewDidLoad()

        author = Author(name: "jack")

        video = Video(author: author)

//        author?.video = video

//        author?.video = nil

//        video?.at = nil

//        author = nil

        video = nil

 
        // Do any additional setup after loading the view.     } }
//若上所示 author与video就被销毁了
/*
分析
初始化author author对象的引用计数加+1
video中也传入author 那么当前author 计数为2
如果想让当前的author被释放 那么它的引用计数需都为0
需要将vide中的author 也置位空
若只是单纯的 将author = nil 与video = nil
当前对象依然被其他其他对象的变量指向着 所以便不能被释放
*/注意事项 可选可置空对象不要定义成懒加载

弱引用于无主引用

import UIKit

class Author{
var name:String
weak var video:Video?
init(name:String) {
self.name = name
}
deinit {
print("Author 被销毁了")
} }
class Video{
unowned var at:Author
init(author:Author) {
self.at = author
}
deinit {
print("Video 被销毁了")
} }
var author:Author? = Author(name: "jack")
var video:Video? = Video(author: author!)
author?.video = video author = nil
video = nil
/*
默认创建的对象都是强引用类型 适用于自动引用计数
如果不想适用于自动引用计数 那么创建的变量就需要被unowned 和 weak 修饰
unowned 无主人引用 适用于非可选形
weak 弱引用 适用于可选项
*/

若将其中一个对象的属性声明去掉weak或 unowned

执行author = nil video = nil 该两个对象依然会被释放 、

这种情况其实和代理声明为啥用weak一样 

import UIKit

class Author{
var name:String
var video:Video?
init(name:String) {
self.name = name
}
deinit {
print("Author 被销毁了")
} }
class Video{
unowned var at:Author
init(author:Author) {
self.at = author
}
deinit {
print("Video 被销毁了")
} }
var author:Author? = Author(name: "jack")
var video:Video? = Video(author: author!)
author?.video = video author = nil
video = nil

/*
当一个闭包作为一个函数的参数,并且是非逃逸闭包时 在闭包中使用当前对象的属性 不需要加self 其他情况均需要加self
*/ class person{
var name:String = ""
var age:Int = 0
init(name:String,age:Int) {
self.name = name
self.age = age
}
lazy var info:() -> String = {[unowned self]
() -> String in
return "我的名字叫\(self.name),年纪\(self.age)了"
}
deinit {
print("pseson释放")
}
} var p:person? = person(name: "jack", age: 18)
print(p!.info())
p = nil
// 打印
//我的名字叫jack,年纪18了
//pseson释放
/*
由于info 闭包捕获了当前对象 要对当前对象进行弱引用 需要在闭包中说明对当前对象进行弱 及在闭包最前面 申明弱引用 [unowned self]
*/

ARC(Automatic Reference Counting)自动引用计数 unowned、weak 使用区别的更多相关文章

  1. xcode禁用ARC(Automatic Reference Counting)

    Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化.ARC是新的LLVM 3.0编译器的一项特性, ...

  2. 自动引用计数(ARC)

    1.1什么是自动引用技术 顾名思义,自动引用计数(ARC, Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术.以下摘自苹果官方说明: 在Objectiv ...

  3. OC - ARC(自动引用计数)

    1.什么是自动引用计数? 顾明思义,自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术. 在OC中采用ARC机制,让编译器来进行内存 ...

  4. Welcome-to-Swift-16自动引用计数(Automatic Reference Counting)

    Swift使用自动引用计数(ARC)来跟踪并管理应用使用的内存.大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情.当实例不再被使用时, ...

  5. obj-c编程11:内存管理和ARC(自动引用计数)

    乖乖隆地洞,这篇文章内容可是不得了,内存管理哦!首先,这个要是搞不明白,你就等着进程莫名其妙的挂死,或是疯狂申请内存却不释放,结果被OS杀死,不管是"自杀"还是"他杀&q ...

  6. Swift ARC 自动引用计数

    1.ARC 引用类型在堆上的内存分配过程中有 8 字节的地址长度用来保存对象的引用计数,堆上的内存并不像栈上那样立即进行回收,系统会定时对堆上的内存进行检查,当某个实例不再被使用时,引用计数会变为 0 ...

  7. swift:自动引用计数ARC

    Swift自动引用计数:ARC    原文链接:https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapte ...

  8. Swift5 语言指南(二十五) 自动引用计数(ARC)

    Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实 ...

  9. ARC(Automatic Reference Counting )技术概述

    此文章由Tom翻译,首发于csdn的blog 转自:http://blog.csdn.net/nicktang/article/details/6792972 Automatic Reference ...

  10. Swift 自动引用计数(ARC)

    Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存 通常情况下我们不需要去手动释放内存,因为 ARC 会在类的实例不再被使用时,自动释放其占用的内存. 但在有些时候我们还是需要在 ...

随机推荐

  1. 移动自动化-swipe、scroll、drag、高级手势等

    swipe 滑动事件 使用方法:driver.swipe(strat_x,start_y,end_x,end_y) swipe通过driver使用 传入起始的位置x和y,和结束的位置x和y 时间参数, ...

  2. 初学银河麒麟linux笔记 第九章 QEMU安装arm虚拟机

    arm虚拟机无法用vm进行安装,因此需要安装QEMU虚拟机 参考: WIndows下使用Qemu安装Arm版Kylin系统_h1007886499的博客-CSDN博客_windows qemu arm ...

  3. A Novel Cross-domain Access Control Protocol in Mobile Edge Computing

    摘要 随着智能移动终端和移动通信技术的发展,移动边缘计算(MEC)已经应用到各个领域.然而,MEC也带来了新的数据安全威胁,包括数据访问威胁.针对MEC中的跨域访问控制问题,提出一种跨域访问控制协议C ...

  4. Java包机制 与Javados 命令

    package: 定义包 import  : 导入包 com.wang.test.* :点* 是导入当前包下的所有类 @author  :注释作者名 @version :注释版本号 @since    ...

  5. 达芬奇18.1.2安装包下载+软件详细破解安装教程(Win&Mac)

    DaVinci Resolve v18.1.2是一款在同一个软件工具中,将剪辑.调色.视觉特效.动态图形和音频后期制作融于一身的解决方案!它采用美观新颖的界面设计,易学易用,能让新手用户快速上手操作, ...

  6. Win10下如何添加“中文简体(美式键盘)”输入法

    参考Win10下如何添加"中文简体(美式键盘)"输入法 设置>>时间和语言>>语言>>添加语言>>选择要安装的语言>>英 ...

  7. 浪潮QQ群成员提取器 V2022

    浪潮QQ群成员提取软件 V2021 最新升级版 使用扫描安全登录QQ,批量获取群列表,然后在读取指定群的群成员列表支持过滤群主.群管理员 支持按最后发言时间提取活跃用户 支持识别僵尸粉和过滤可以导出文 ...

  8. MySQL连接提示 public key retrieval is not allowed

    使用DBeaver连接mysql数据提示public key retrieval is not allowed 修改DBeaver的驱动属性中的allowPublicKeyRetrieval

  9. skype网络异常无法登录

    在有些win7电脑上安装最新版skype软件后,打开skype软件后显示无法访问网络 检查网络及防火墙,确定无异常 最后排查原因定位到操作系统的根证书 发现系统缺少部分DigiCert的根证书 从其他 ...

  10. vue-pc项目放到电视tv上适配

    当部署屏幕小于开发屏幕大小的时候,我们通过transform:scale(0.8)对页面进行整体缩放,部署后不生效时,可以找到项目的index.html文件,将viewpoint这一行代码注释掉,或者 ...