2017-03-21 10:13:48 qq_28379951 阅读数 391

deinit: 析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数

OC中的dealloc 一样的,通常在deinitdealloc中需要执行的操作有:

  • 对象销毁
  • KVO移除
  • 移除通知
  • NSTimer销毁

当前VC销毁之后,所持有对象也会销毁.

2019-03-07 20:23:22 qq_40023759 阅读数 781

前言:

strong:当你声明一个属性时,它默认就是强引用

weak:弱引用对象的引用计数不会+1, 必须为可选类型变量

在声明弱引用对象是必须用var关键字, 不能用let.
因为弱引用变量在没有被强引用的条件下会变为nil, 而let常量在运行的时候不能被改变.

 

  deinit {
        //移除监听
        NotificationCenter.default.removeObserver(self)
    }

这个种情况

1.当前页面是否存在delegate 
 

 var delegate:ZQStarReteViewDelegate?//这种是错误的写法

 weak open var delegate:ZQStarReteViewDelegate?

2.方法体中是否用到了self 

 在swift中 有特殊的写法  [weak self]
        loadData { [weak self] (dataString) -> () in

            //以后在闭包中中 使用self 都是若引用的
            print("\(dataString) \(self?.view)")
        }
或者
  weak var weakSelf = self
        loadData { (dataString) -> () in
            print("\(dataString) \(weakSelf?.view)")
        }

这种问题又多出现在RX 的监听事件中

 //监听键盘弹出通知
        _ = NotificationCenter.default.rx
            .notification(NSNotification.Name.UIKeyboardWillShow)
            .takeUntil(self.rx.deallocated) //页面销毁自动移除通知监听
            .subscribe(onNext: { _ in
                print("键盘出现了")
            })
         
        //监听键盘隐藏通知
        _ = NotificationCenter.default.rx
            .notification(NSNotification.Name.UIKeyboardWillHide)
            .takeUntil(self.rx.deallocated) //页面销毁自动移除通知监听
            .subscribe(onNext: { _ in
                print("键盘消失了")  
            })
//这里要注意这就是一个坑,这里面就写一个打印事件,事件定是会被移除。但是这种一旦写入 如
 //监听键盘隐藏通知
        _ = NotificationCenter.default.rx
            .notification(NSNotification.Name.UIKeyboardWillHide)
            .takeUntil(self.rx.deallocated) //页面销毁自动移除通知监听
            .subscribe(onNext: { _ in
                print("键盘消失了")  
              self.text_name = "张三"
            })
这个事件就不会被移除
此时应该
1. _ = NotificationCenter.default.rx
            .notification(NSNotification.Name.UIKeyboardWillHide)
            .takeUntil(self.rx.deallocated) //页面销毁自动移除通知监听
            .subscribe(onNext: {[weak self] _ in
                print("键盘消失了")  
              self?.text_name = "张三"
            })
2.
 weak var weakSelf = self
        _ = NotificationCenter.default.rx
            .notification(NSNotification.Name.UIKeyboardWillHide)
            .takeUntil(self.rx.deallocated) //页面销毁自动移除通知监听
            .subscribe(onNext: { _ in
                print("键盘消失了")  
              weakSelf?.text_name = "张三"
            })

 

2017-07-21 10:05:59 kkyu080 阅读数 2218

swift iOS 不执行deinit的原因:

1、使用了UITabView,没做优化(其中一个优化方案是,在UIView中自定义一个,然后让UIViewController调用)

2、代理使用了强引用,delege = self 

     改成:

     weak var weakSelf = self

     delete  = weakSelf!

3、方法体传参中使用了强引用


原来的代码

修改后的代码

—————我是优雅的广告,请多多关注简书作者,鱼笨自由—————

2016-09-01 20:44:21 javazhangjin 阅读数 2000

  学习swit语法,本文是讨论class的init()与deinit(),本人是做java出生,java的gc在swift中也得到了很好的解释,看swift初始化没有难度,当引用在代码中不在使用的时候,swift内存就要释放,deinit()方法就会被得到调用,还有个概念可以帮助理解,referencecount(引用计数器), 当引用使用的时候计数器会+1,反之不使用的时候会-1.下面来看代码解释刚刚的理解。

  本次例子在xcode playground中演示

   

因为在playground中,andrea的引用一直没有释放掉,deinit()方法没有得到调用,我们使用个小技巧


使用代码块,这样deinit()方法就会别调用了,我们再加一个Person数组看下,如果数组中一直持有andrea对象的引用会是什么样子


持有引用后对象就没有释放内存,也就是没有调用deinit()方法,想要释放内存就清除people数组中元素


这样就被释放了。还有一种情况对象之间有弱引用,有弱引用也是不会释放内存的


这样的内存泄漏十分难定位,这时候为了避免这样的错误,在弱引用前加上weak关键字,swift就会回收那部分内存了





swft deinit

阅读数 119

Swift中移除通知

阅读数 1136

没有更多推荐了,返回首页