我们都知道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 内存释放问题的更多相关文章

  1. IOS应用内存释放机制

    这是由iOS系统管理决定的,但APP退出在后台后,只有10秒的持续运行时间,然后暂停.但该APP还在内存中,当出现内存警告,也就是别的APP要运行,而此时内存又不足的情况下,系统会回收停在后台APP所 ...

  2. 理解 iOS 的内存管理

    远古时代的故事 那些经历过手工管理内存(MRC)时代的人们,一定对 iOS 开发中的内存管理记忆犹新.那个时候大约是 2010 年,国内 iOS 开发刚刚兴起,tinyfool 大叔的大名已经如雷贯耳 ...

  3. iOS ARC内存管理

    iOS的内存管理机制,只要是iOS开发者,不管多长的时间经验,都能说出来一点,但是要深入的理解.还是不简单的.随着ARC(自动管理内存)的流行.iOS开发者告别了手动管理内存的复杂工作.但是自动管理内 ...

  4. iOS 出现内存泄漏的几种原因

    一.从AFNet 对于iOS开发者,网络请求类AFNetWorking是再熟悉不过了,对于AFNetWorking的使用我们通常会对通用参数.网址环境切换.网络状态监测.请求错误信息等进行封装.在封装 ...

  5. iOS的内存管理和引用计数规则、Block的用法以及三种形式(stack、malloc、global)

    学习内容 iOS的内存管理和引用计数规则 内存管理的思考方式 自己生成的对象自己持有 非自己生成的对象自己也能持有 自己持有的对象不需要时释放 非自己持有的对象不能释放 ARC有效时,id类型和对象类 ...

  6. iOS app内存分析套路

    iOS app内存分析套路 Xcode下查看app内存使用情况有2中方法: Navigator导航栏中的Debug navigator中的Memory Instruments 一.Debug navi ...

  7. [转]ios平台内存常见问题

    本文转自CocoaChina,说的满详细的: 链接地址:http://www.cocoachina.com/bbs/read.php?tid=94017&keyword=%C4%DA%B4%E ...

  8. Unity3D内存释放

    Unity3D内存释放 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resourc ...

  9. iOS常见内存泄漏解决

    iOS常见内存泄漏解决     1 OC和CF转化出现的内存警告 CFStringRef cfString = CFURLCreateStringByAddingPercentEscapes(kCFA ...

随机推荐

  1. gai_strerror函数

    一.函数原型 #include <netdb.h> const char *gai_strerror(int error); 返回:指向错误描述消息字符串的指针 二.由getaddrinf ...

  2. S02-45 struts2 最新漏洞 学习记录

    今天和朋友一起学习S02-45.按照官方解释:Content-Type:multipart/form-data 这个条件成立的时候,能够触发jakarta的上传漏洞.可能导致远程执行任意代码或者上传文 ...

  3. php 随机生成数字字母组合

    直接上代码: function getRandomString($len, $chars=null) { if (is_null($chars)) { $chars = "abcdefghi ...

  4. 如何解决无法成功git commit 和git push

    如何解决无法成功git commit 和git push 20155324王鸣宇.20155314刘子健 git add . 成功了 但是git commit无法实现. 我先尝试了卸载git 重新下载 ...

  5. oracle 根据在线更新分区。

    LOG_PURCHASEINFO 是没有分区之前的表,根据 LOG_PURCHASEINFO_P 分区好的表在线更新 LOG_PURCHASEINFO表,让他变成分区表.11g才可以使用list_ra ...

  6. Java SE之反射技术[Class,Field](一)

    一.什么是反射? 反射库(Reflection Library)提供了一个非常丰富且精心设计的工具集,以便编写能够动态操纵Java代码的程序.这项功能被大量地应用在JavaBeans中,它是Java组 ...

  7. Tip: JSP开发模式

    SUN公司推出JSP技术后,同时也推荐了两种web应用程序的开发模式,一种是JSP+JavaBean模式,一种是Servlet+JSP+JavaBean模式. JSP+JavaBean模式适合开发业务 ...

  8. ASP.NET MVC - 安全、身份认证、角色授权和ASP.NET Identity

    ASP.NET MVC - 安全.身份认证.角色授权和ASP.NET Identity ASP.NET MVC内置的认证特性 AuthorizeAttribute特性(System.Web.Mvc)( ...

  9. 【转载】使用python库--Graphviz为论文画出漂亮的示意图

    原文: Drawing Graphs using Dot and Graphviz 1 License Copyright (C) 2013, 2014, 2015, 2016, 2017, 2018 ...

  10. 关于istream_iterator<int>(cin)和istream_iterator<int>()的一点分析

    最近在看STL,其中讲到容器这一部分的时候,有以下两个式子,有点疑惑: deque<) //函数声明 deque<) //定义一个容器 式子原本的含义都是要定义一个容器,容器的内容从标准输 ...