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 会在类的实例不再被使用时,自动释放其占用的内存. 但在有些时候我们还是需要在 ...
随机推荐
- Linux 搭建Apache(httpd)服务
简介:Apache HTTP Server是开源软件项目,基于标准的HTTP网络协议提供的网页浏览服务,http是Apache服务器的主程序,它是一个独立的后台进程. 1. 安装 A. 安装httpd ...
- 083_SFDC Limit(二) 及良好的开发习惯
关于常见开发中遇到的limit,应如何处理:https://developer.salesforce.com/page/Apex_Code_Best_Practices 链接内容很好,就不一一做解释 ...
- netmiko批量操作网络设备_pandas版
from concurrent.futures import ThreadPoolExecutor import netmiko import os from threading import Loc ...
- 2、k8s 基础环境安装
3 k8s 环境配置 3.1 基础环境准备 所有机器执行 #各个机器设置自己的域名 我的设置为 hostnamectl set-hostname ks8-master.hostnamectl set- ...
- 微积分 I 笔记
1.1 集合 这一节复习了高中关于集合的基础知识 介绍了一些新的概念 笛卡尔积 (Cartesian Product) 集合 \(X\) 与 \(Y\) 的笛卡尔积 (直积) \(X \times Y ...
- 数位dp( tzoj6061:Bomb-求49个数;tzoj1427: 不要62)
6061:http://www.tzcoder.cn/acmhome/problemdetail.do?method=showdetail&id=6061 dfs记忆化搜索 #include& ...
- Foxmail配置Exchange报错:RPC 服务器不可用 的解决方法
如果确定了你电脑的RPC服务正常开启了,还是报这个错,那可能是你的Foxmail版本太低了, 低版本用Exchange时就会报这个错,升级为最新版就好了,我升级到7.2.23就正常了
- WPF 使用Path(自定义控件,圆形进度条)
原文:https://www.cnblogs.com/tsliwei/p/5609035.html 原文链接:https://blog.csdn.net/johnsuna/article/detail ...
- mysql 的 json 类型
MySQL的 json 数据类型 MySQL5.7 后的版本,添加了对于 json 类型的支持.此前,json 类型的数据,只能在代码层面做 json.loads() 和 json.dumps() 操 ...
- env_config
import sys import os root_path = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__f ...