• 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)
    
            
            
            
            
        }
  • 相关阅读:
    Microsoft 基准安全分析器(MBSA)
    神奇的C++模版
    Windows下的Memcache安装
    BisonFlex 笔记
    虚函数背后的秘密
    如何切换SecureCRT的帐号
    动态生成JS 实现 .NET 网站广告管理
    fatal error C1853 预编译头文件来自编译器的早期版本 解决方法
    解决 unresolved external symbol 无法解析 _send@16
    linux远程登录
  • 原文地址:https://www.cnblogs.com/breezemist/p/6292083.html
Copyright © 2020-2023  润新知