RxSwift(9)内存管理

2019-08-09  本文已影响0人  忆痕无殇

RxSwift的内存管理也应该是本着创建-->使用-->释放的原则。同样是引用计数原理。

一、在OCARC中获取引用计数的方法是

1.使用KVC

[obj valueForKey:@"retainCount"]

2.使用私有API

OBJC_EXTERN int _objc_rootRetainCount(id);
_objc_rootRetainCount(obj)

3.使用CFGetRetainCount

CFGetRetainCount((__bridge CFTypeRef)(obj))

但在多线程等情况下返回值是不准确的。

二、在RxSwift中获取引用计数的方法是使用total观察引用关系。
RxSwift.Resources.total

通过观察界面进入计数增加,界面移除界面消失来判断是否有循环引用,内存泄漏。

三、APP启动全过程

1:APP启动过程

2:程序执行

3:界面的生命周期
*alloc 创建对象,分配空间

############四、内存泄漏产生的原因
1:第三方框架使用不当
2:闭包循环引用
3:delegate的循环引用
4:大次数循环内存暴涨
5:计时器的循环引用

五、RxSwift循环引用列子
例1:

 
    func rxRetainCycleDemo3(){
        
        // create -> self
        // create -> self -> anyObserver -> observer -> AnonymousObservableSink.on
        // -> AnonymousObserver.on -> onNext?(value) -> subscribe{} -> self
        
        // self -> observer -> AnyObserver 
        // subscribe -> AnonymousObserver
        
        Observable<Any>.create { (anyObserver) -> Disposable in
            self.observer = anyObserver
            anyObserver.onNext("Hello word")
            return Disposables.create()
            }
            .subscribe(onNext: { (item) in
                print(self)
                print("订阅到:\(item)")
            })
            .disposed(by: self.disposeBag)
    }

例2:

 func rxRetainCycleDemo2(){

        // 持有序列 - create
        // self -> observable -> create{} -> self
        self.observable = Observable<Any>.create { (anyObserver) -> Disposable in
            anyObserver.onNext("Hello word")
            return Disposables.create()
        }
        
        // 持有序列 - 订阅
        // self -> observable -> subscribe onNext -> self
        self.observable?.subscribe(onNext: {
            print(self)
            print("订阅到1:\($0) --")
        })
            .disposed(by: self.disposeBag)
        
    }

例3:

 func retainCycleDemo() {
    
        
        // self -> myClosure -> {}  -> self  -释放不掉
        myClosure = {[weak self] in
            // weak - strong - dance
            guard let self = self else { return }
            DispatchQueue.global().asyncAfter(deadline: .now()+2, execute: {
                self.name = "Cooci"
                print(self.name)
            })
        }
        self.myClosure!()
    }
    

例4:

 
  func rxRetainCycleDemo1() {
        
//        self.accountTF.rx.text.orEmpty
//            .debug()
//            .subscribe(onNext: { [weak self](text) in
//                self?.title = text
//            })
//            .disposed(by: disposeBag)
        
        self.accountTF.rx.text.orEmpty
            .bind(to: self.rx.title)
            .disposed(by: disposeBag)
        
    }

最重要的没写:怎么避免内存泄漏打破循环引用。
使用 unowned和weak关键字。感觉还的接着写。这个没有抓住重点。

上一篇下一篇

猜你喜欢

热点阅读