Swift iOS : 内存管理
Swift是自动管理内存的。这意味着,你不需要主动释放内存。
比如Foo内包含的Bar,可以随同Foo一起被释放:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {var window : UIWindow?func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {Foo()return true}
}
class Foo {let bar: Barinit() {bar = Bar()}deinit {print("Foo exit")}
}
class Bar {deinit {print("Bar exit")}
}复制代码
执行此代码,会打印:
Foo exit
Bar exit复制代码
可见Foo和Bar都是自动释放的。作为程序员,你不需要做任何内存的主动释放。
但是,有一种特殊情况,叫做双向引用,导致释放A时,需要释放B,而B又引用了A,那么两个都无法被释放:
class Foo {let bar: Barinit() {bar = Bar()bar.foo = self}deinit {print("Foo exit")}
}
class Bar {var foo: Foo? = nildeinit {print("Bar exit")}
}复制代码
此代码只会打印:
App exit复制代码
此时,需要做的就是把这个双向引用中的一个设置为weak,表示的意思是尽管我持有这个引用,但是释放的时候,却无需考虑此对象的释放。
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {var window : UIWindow?func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {Baz()print("App exit")return true}
}
typealias Bar = (()->Void)
class Foo {func work(_ bar : Bar) {bar()}deinit {print("Foo exit")}
}
class Baz {var a : String?init (){a = "1"let f = Foo()f.work(){[weak self]() inprint(self?.a)}}
}复制代码
当然,不标记也是不行的,因为编译器就不会通过,它要求只要引用了self,就必须标记。
Swift iOS : 内存管理相关推荐
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
本文作者:王拥军 腾讯自选股高级开发工程师 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创. 对于i ...
- iOS内存管理策略和实践
来源:http://www.baidu.com/link?url=irojqCBbZKsY7b0L2EBPkuEkfJ9MQvUf8kuNWQUXkBLk5b22Jl5rjozKaJS3n78jCnS ...
- iOS内存管理(ARC,MRC)
iOS内存管理方式: ARC Automatic Reference Counting 自动引用计数 MRC Manual Reference Counting 手动引用计数 更改管理方式: 内存管理 ...
- iOS内存管理系列之一:对象所有权与引用计数
原文地址:[转]iOS内存管理系列之一:对象所有权与引用计数作者:anynot 内存管理是iPhone或iPad开发中最为重要的一部分.掌握好了内存管理,开发出的应用就能运行流畅:掌握不好,开发出的东 ...
- iOS内存管理机制解析
软件运行时会分配和使用设备的内存资源,因此,在软件开发的过程中,需要进行内存管理,以保证高效.快速的分配内存,并且在适当的时候释放和回收内存资源. 一.Objective-C内存管理的对象 IOS开发 ...
- iOS内存管理——alloc/release/dealloc方法的GNUstep实现与Apple的实现
关于阅读<Object-C高级编程-iOS与OS X多线程和内存管理>一书后的iOS内存管理系列思考 <关于iOS内存管理的规则思考> <iOS内存管理--alloc/r ...
- 终于明白那些年知其然而不知其所以然的iOS内存管理方式
终于明白那些年知其然而不知其所以然的iOS内存管理方式 前言 从我开始学习iOS的时候,身边的朋友.网上的博客都告诉我iOS的内存管理是依靠引用计数的,然后说引用计数大于1则对象保存在内存的堆中而引用 ...
- iOS 开发:彻底理解 iOS 内存管理(MRC 篇)
本文首发于我的个人博客:「程序员充电站」 文章链接:「传送门」 本文更新时间:2021年08月17日17:11:59 本文是 「iOS 开发:彻底理解 iOS 内存管理」系列的「MRC 篇」. 用来对 ...
- iOS内存管理 —— 自动释放池和runloop
iOS内存管理 -- 自动释放池和runloop 1. 自动释放池 1.1 自动释放池介绍 1.2 自动释放池底层原理 objc_autoreleasePoolPush autoreleaseNoPa ...
最新文章
- Linux下C++开发工具介绍
- SQL Server 任务监控脚本
- 手动创建swap分区
- Gibbs sampling [Gibbs采样]
- CodeForces - 1293C NEKO's Maze Game(思维,水题)
- Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
- windows商店_Windows记事本应用现在可以从Microsoft Store中获得
- 抖音网红mac桌宠Desktop Goose呆头鹅的使用教程
- 图的深度优先遍历java代码详解
- 保研计算机三级,保研干货 | 这些证书手中有,凡尔赛路任你走
- 单片机:红外遥控实验(内含红外遥控介绍+硬件原理+软件编程+配置环境)
- Idea主菜单栏不见了怎么找回
- 基于 STM32F412RE 的 Flappy bird 游戏机实现
- 记录一下Alphapose安装过程
- php调用微信公众号支付接口,Thinkphp微信公众号支付接口
- 计算机网络习题篇(一)
- 惠普笔记本固态装系统。
- 成都新房二手房房价采集
- Java 拆分PDF文档
- 新产品Digi XBee RR无线模块迁移指南
热门文章
- html 响应式布局 九宫格,两种方法实现响应式九宫格布局
- mysql update upper_MySQL数据处理函数upper、abs、date
- python文件操作模式是什么,python --文件操作模式详解
- nginx 在阿里云怎么安装mysql_阿里云Linux服务器安装 nginx+mysql+php
- fpgrowth算法实战 mlib_【spark】41.Spark Mlib:FPGrowth算法
- python去重保留唯一一个值_Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)...
- php读取mysql数据无法修改时间_php设置mysql查询读取数据的超时时间
- MySQL 异常:这一篇就够了,MySQL 抛出异常的几种常见解决方式小结
- java输入行数打印菱形_JAVA题,输入行数,输入列数,输出一个菱形
- java中包容易出现的错误及权限问题