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 ...
随机推荐
- IPv6地址测试宏
- ps 命令的十个简单用法【转】
注记 ps 命令有两种不同的语法风格 —— BSD 与 UNIX 两种风格.新手常常对这两种形式产生误解,因此我们有必要在这里作一个简单的说明: ps aux 与 ps -aux 是不同的,例如 -u ...
- Javaweb学习笔记——(十)——————response对象,response字符流缓冲器,响应头,状态码,重定向,requset对象,路径和乱码
请求响应对象: request和response *当服务器接收都请求后,服务器会创建request和response对象,把请求数据封装到request对象中: *然后调用Servlet的sevic ...
- mysql比较运算符和函数
mysql> SELECT 15 BETWEEN 1 AND 22;+---------------------+| 15 BETWEEN 1 AND 22 |+---------------- ...
- 总结PHP如何获取当前主机、域名、网址、路径、端口和参数等
//获取域名或主机地址 echo $_SERVER['HTTP_HOST']."<br />"; //获取网页地址 echo $_SERVER['PHP_SELF']. ...
- KMP模板(HDU1711)
#include<stdio.h> #include<math.h> #include<string.h> #include<stack> #inclu ...
- Eclipse安装lombok及常用注解
转自:https://blog.csdn.net/ZJDWHD/article/details/77795023 lombok的官方网址:http://projectlombok.org/ https ...
- Python Django CBV下的通用视图函数
ListView TemplateView DetailView 之前的代码实例基本上都是基于FBV的模式来撰写的,好处么,当然就是简单粗暴..正如: def index(request): retu ...
- eureka 学习
Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS c ...
- Microsoft SQL - 查询与更新
查询与更新(Query & Update) 转义引号 SQL语句中字符串只能使用单引号,如果需要转义,可用单引号转义单引号. 查询(Inquire) 以下公式中的c指代列名. 规则 1.查询语 ...