iOS weak 内存释放问题
我们都知道weak 关键字可以解决内存不释放问题,但是使用上有些讲究。
看代码:
import UIKit
var str = "Hello, playground"
class Name{
deinit {
print("name deinit")
}
}
class Person{
var name:Name?
func test(){
let tempName = Name()
weak var weakName = tempName
self.name = weakName
}
}
let person = Person()
person.test()
运行之后,控制台并没有输出name deinit,也就是说 Name对象并没有被释放。
再看下这段代码:
import UIKit
var str = "Hello, playground"
class Name{
deinit {
print("name deinit")
}
}
class Person{
weak var name:Name?
func test(){
let tempName = Name()
self.name = tempName
}
}
let person = Person()
person.test()
运行后,输出了name deinit.
从这上面两个对比中,我们可以看出 weak 声明的指针,当被当做右值时,所代表的也是对象的地址,和strong型的指针没有区别。
把一个weak的指针再赋给一个strong型的指针,这个stong型的指针就会把相应对象进行强引用。
看一个实际问题:下面这段代码就是错误的! 我们在写block时,常常记得使用
weak var weakSelf = self 声明一个变量,之后在block中使用weakSelf 来防止循环引用。这种做法好用的原因,是因为我们自己实现的block中,不会把weakself当做右值对一个强指针进行赋值。而 timer的默认实现里,我认为是有这种赋值的,从而导致了循环引用。
class PlayerScene: SKScene {
var lockedTimer:Timer!
required init?(coder aDecoder: NSCoder) {
weak var weakSelf = self //错误写法
lockedTileNodeTimer = Timer(timeInterval: 1.0, target: weakSelf, selector: #selector(checkLockedTileNodes), userInfo: nil, repeats: true)
}
iOS weak 内存释放问题的更多相关文章
- IOS应用内存释放机制
这是由iOS系统管理决定的,但APP退出在后台后,只有10秒的持续运行时间,然后暂停.但该APP还在内存中,当出现内存警告,也就是别的APP要运行,而此时内存又不足的情况下,系统会回收停在后台APP所 ...
- 理解 iOS 的内存管理
远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳 ...
- iOS ARC内存管理
iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...
- iOS 出现内存泄漏的几种原因
一.从AFNet 对于iOS开发者,网络请求类AFNetWorking是再熟悉不过了,对于AFNetWorking的使用我们通常会对通用参数.网址环境切换.网络状态监测.请求错误信息等进行封装.在封装 ...
- iOS的内存管理和引用计数规则、Block的用法以及三种形式(stack、malloc、global)
学习内容 iOS的内存管理和引用计数规则 内存管理的思考方式 自己生成的对象自己持有 非自己生成的对象自己也能持有 自己持有的对象不需要时释放 非自己持有的对象不能释放 ARC有效时,id类型和对象类 ...
- iOS app内存分析套路
iOS app内存分析套路 Xcode下查看app内存使用情况有2中方法: Navigator导航栏中的Debug navigator中的Memory Instruments 一.Debug navi ...
- [转]ios平台内存常见问题
本文转自CocoaChina,说的满详细的: 链接地址:http://www.cocoachina.com/bbs/read.php?tid=94017&keyword=%C4%DA%B4%E ...
- Unity3D内存释放
Unity3D内存释放 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resourc ...
- iOS常见内存泄漏解决
iOS常见内存泄漏解决 1 OC和CF转化出现的内存警告 CFStringRef cfString = CFURLCreateStringByAddingPercentEscapes(kCFA ...
随机推荐
- [Windows] [VS] [C] [取得指针所指内存的二进制形式字符]
// 取得指针所指内存的十六进制形式字符串,size指定字节长度#define Mem_toString(address, size) _Mem_toString((PBYTE)address, si ...
- CSRF与SSRF区别
CSRF 攻击者盗用了你的身份,以你的名义发送恶意请求.CSRF能够做的事情包括:以你的名义发送邮件,发消息,盗用你的账号,甚至于购买商品,虚拟货币转账... 发生条件: 1.登录受信任网站A,并在本 ...
- MobSF移动渗透测试框架
1.https://github.com/MobSF/Mobile-Security-Framework-MobSF/wiki/1.-Documentation 2.http://www.freebu ...
- C#基础_MD5
MD5加密 1创建Md5 2.开始加密,需要将字符转换为字节数组 3.返回一个加密好的字节数组 4.将字节数组中每个元素按照指定的编码格式解析成字符串 1 static void Main(strin ...
- super 的用法
通过用static来定义方法或成员,为我们编程提供了某种便利,从某种程度上可以说它类似于C语言中的全局函数和全局变量.但是,并不是说有了这种便利,你便可以随处使用,如果那样的话,你便需要认真考虑一下自 ...
- APPLE-SA-2019-3-25-3 tvOS 12.2
APPLE-SA-2019-3-25-3 tvOS 12.2 tvOS 12.2 is now available and addresses the following: CFStringAvail ...
- 结构体类型struct
教学视频 定义: struct student{CString name; int num; TCHAR sex; int age; }; //注意有个分号 student zansan = {_ ...
- qt5学习目录
qt5下载与安装,VS2017的环境配置 q ...
- 树链剖分模板(洛谷P3384)
洛谷P3384 #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " < ...
- 第25月第3天 Mxshop项目记录01
1.项目 https://github.com/mtianyan/VueDjangoFrameWorkShop virtualenv命令 virtualenv . virtualenv -p /ana ...