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 : 内存管理相关推荐

  1. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    本文作者:王拥军 腾讯自选股高级开发工程师 Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创. 对于i ...

  2. iOS内存管理策略和实践

    来源:http://www.baidu.com/link?url=irojqCBbZKsY7b0L2EBPkuEkfJ9MQvUf8kuNWQUXkBLk5b22Jl5rjozKaJS3n78jCnS ...

  3. iOS内存管理(ARC,MRC)

    iOS内存管理方式: ARC Automatic Reference Counting 自动引用计数 MRC Manual Reference Counting 手动引用计数 更改管理方式: 内存管理 ...

  4. iOS内存管理系列之一:对象所有权与引用计数

    原文地址:[转]iOS内存管理系列之一:对象所有权与引用计数作者:anynot 内存管理是iPhone或iPad开发中最为重要的一部分.掌握好了内存管理,开发出的应用就能运行流畅:掌握不好,开发出的东 ...

  5. iOS内存管理机制解析

    软件运行时会分配和使用设备的内存资源,因此,在软件开发的过程中,需要进行内存管理,以保证高效.快速的分配内存,并且在适当的时候释放和回收内存资源. 一.Objective-C内存管理的对象 IOS开发 ...

  6. iOS内存管理——alloc/release/dealloc方法的GNUstep实现与Apple的实现

    关于阅读<Object-C高级编程-iOS与OS X多线程和内存管理>一书后的iOS内存管理系列思考 <关于iOS内存管理的规则思考> <iOS内存管理--alloc/r ...

  7. 终于明白那些年知其然而不知其所以然的iOS内存管理方式

    终于明白那些年知其然而不知其所以然的iOS内存管理方式 前言 从我开始学习iOS的时候,身边的朋友.网上的博客都告诉我iOS的内存管理是依靠引用计数的,然后说引用计数大于1则对象保存在内存的堆中而引用 ...

  8. iOS 开发:彻底理解 iOS 内存管理(MRC 篇)

    本文首发于我的个人博客:「程序员充电站」 文章链接:「传送门」 本文更新时间:2021年08月17日17:11:59 本文是 「iOS 开发:彻底理解 iOS 内存管理」系列的「MRC 篇」. 用来对 ...

  9. iOS内存管理 —— 自动释放池和runloop

    iOS内存管理 -- 自动释放池和runloop 1. 自动释放池 1.1 自动释放池介绍 1.2 自动释放池底层原理 objc_autoreleasePoolPush autoreleaseNoPa ...

最新文章

  1. Linux下C++开发工具介绍
  2. SQL Server 任务监控脚本
  3. 手动创建swap分区
  4. Gibbs sampling [Gibbs采样]
  5. CodeForces - 1293C NEKO's Maze Game(思维,水题)
  6. Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
  7. windows商店_Windows记事本应用现在可以从Microsoft Store中获得
  8. 抖音网红mac桌宠Desktop Goose呆头鹅的使用教程
  9. 图的深度优先遍历java代码详解
  10. 保研计算机三级,保研干货 | 这些证书手中有,凡尔赛路任你走
  11. 单片机:红外遥控实验(内含红外遥控介绍+硬件原理+软件编程+配置环境)
  12. Idea主菜单栏不见了怎么找回
  13. 基于 STM32F412RE 的 Flappy bird 游戏机实现
  14. 记录一下Alphapose安装过程
  15. php调用微信公众号支付接口,Thinkphp微信公众号支付接口
  16. 计算机网络习题篇(一)
  17. 惠普笔记本固态装系统。
  18. 成都新房二手房房价采集
  19. Java 拆分PDF文档
  20. 新产品Digi XBee RR无线模块迁移指南

热门文章

  1. html 响应式布局 九宫格,两种方法实现响应式九宫格布局
  2. mysql update upper_MySQL数据处理函数upper、abs、date
  3. python文件操作模式是什么,python --文件操作模式详解
  4. nginx 在阿里云怎么安装mysql_阿里云Linux服务器安装 nginx+mysql+php
  5. fpgrowth算法实战 mlib_【spark】41.Spark Mlib:FPGrowth算法
  6. python去重保留唯一一个值_Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)...
  7. php读取mysql数据无法修改时间_php设置mysql查询读取数据的超时时间
  8. MySQL 异常:这一篇就够了,MySQL 抛出异常的几种常见解决方式小结
  9. java输入行数打印菱形_JAVA题,输入行数,输入列数,输出一个菱形
  10. java中包容易出现的错误及权限问题