ARC(Automatic Reference Counting)自动引用计数 unowned、weak 使用区别
自动引用计数
引用类型(类、函数、闭包) 当声明一个变量指向某个引用类型时 当前引用类型的引用计数就会加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 使用区别的更多相关文章
- xcode禁用ARC(Automatic Reference Counting)
Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化.ARC是新的LLVM 3.0编译器的一项特性, ...
- 自动引用计数(ARC)
1.1什么是自动引用技术 顾名思义,自动引用计数(ARC, Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术.以下摘自苹果官方说明: 在Objectiv ...
- OC - ARC(自动引用计数)
1.什么是自动引用计数? 顾明思义,自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术. 在OC中采用ARC机制,让编译器来进行内存 ...
- Welcome-to-Swift-16自动引用计数(Automatic Reference Counting)
Swift使用自动引用计数(ARC)来跟踪并管理应用使用的内存.大部分情况下,这意味着在Swift语言中,内存管理"仍然工作",不需要自己去考虑内存管理的事情.当实例不再被使用时, ...
- obj-c编程11:内存管理和ARC(自动引用计数)
乖乖隆地洞,这篇文章内容可是不得了,内存管理哦!首先,这个要是搞不明白,你就等着进程莫名其妙的挂死,或是疯狂申请内存却不释放,结果被OS杀死,不管是"自杀"还是"他杀&q ...
- Swift ARC 自动引用计数
1.ARC 引用类型在堆上的内存分配过程中有 8 字节的地址长度用来保存对象的引用计数,堆上的内存并不像栈上那样立即进行回收,系统会定时对堆上的内存进行检查,当某个实例不再被使用时,引用计数会变为 0 ...
- swift:自动引用计数ARC
Swift自动引用计数:ARC 原文链接:https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapte ...
- Swift5 语言指南(二十五) 自动引用计数(ARC)
Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实 ...
- ARC(Automatic Reference Counting )技术概述
此文章由Tom翻译,首发于csdn的blog 转自:http://blog.csdn.net/nicktang/article/details/6792972 Automatic Reference ...
- Swift 自动引用计数(ARC)
Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存 通常情况下我们不需要去手动释放内存,因为 ARC 会在类的实例不再被使用时,自动释放其占用的内存. 但在有些时候我们还是需要在 ...
随机推荐
- Mac用自带软件QuickTime Player进行录屏
Mac电脑用自带软件QuickTime Player进行录屏的教程,几步就可以学会,挺简单的. 1.首先,找到并打开QuickTime Player软件.可以鼠标右键这个图标,选择"选项 ...
- Hadoop2.7.3源码编译
一.编译源码步骤演示详解 需求:官网下载的hadoop包,执行hadoop命令时,会有警告信息,为去除此警告,需要重新编译hadoop相应版本的源码,替换hadoop安装包lib目录下的native( ...
- Git探究
Git Git是什么? Git是一个开源的分布式版本控制系统. 1.什么是版本控制? 字面意思,控制版本,存储.追踪目录和文件的修改历史.市面上有各式各样的版本控制工具,比较常用的SVN.Git等等. ...
- python 在路径下创建文件/文本文件 没有路径自动创建
1.一般在执行文件的同级目录下创建一个文本文件: file = open("1.txt", "w", encoding="utf8") # ...
- Python 切片/列表/字符串之间装换
1. 怎么实现字符串变为list 使用split(),把字符串拆分再存入数组: 例子 input="ni si shi" output=input.split(" &qu ...
- IaaS--区域和可用区(何恺铎《深入浅出云计算》笔记整理)
[关键概念] IaaS(Infrastructure as a Service):即"基础设施即服务",一般指云计算所提供的计算.存储.网络等基本底层能力.是基于软件技术对物理硬件 ...
- 在CentOS 7.4下配置VNC Server服务
安装步骤 1. 查询系统是否安装vnc-server [root@localhost ~]# rpm –qa | grep vnc 如果有返回值,类似于vnc-server-的值,说明已经安装了vnc ...
- centos7上搭建Jenkins环境
选择在centos 上安装jdk和tomcat来搭建Jenkins 1.jdk安装 查看有没有java环境:rpm -qa | grep java 如果没有java环境的话,接着就去查找java-1. ...
- Cadence Allegro创建盲埋孔
1.首先创建两个常规过孔,文件名分别为Via10d4.Via16d8. 2.打开PCB Editor,然后选择菜单Setup -> B/B ViaDefinitions -> Define ...
- fillder弱网测试
打开Fiddler,Rules->Performance->勾选 Simulate Modem Speeds,勾选之后访问网站会发现网络慢了很多. 二.设置弱网参数:菜单Rules-> ...