在项目中自己写出了一个循环引用的典型例子,如下
Viewcontroller
class FirstViewController: UIViewController {
var baseView:BaseView?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.baseView = BaseView()
self.baseView?.backgroundColor = UIColor.red;
self.view.addSubview(self.baseView!)
self.baseView?.superself = self
}
deinit {
print("first dealloc")
}
}
BaseView
class BaseView: UIView {
// 这边必须使用weak 或者 unowned
weak var superself:UIViewController?
// unowned var superSelf:UIViewController?
override init(frame: CGRect) {
super.init(frame: frame);
initViews();
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
//MARK:-
func initViews() -> Void {
}
}
注:BaseView 所有子类也必须使用weak 来方式循环引用
block块的循环引用 我就不再多说了,其他博客有详解的,主要使用self的地方要使用 [unowned self]和[weak self]
简单的小例子
//
// BaseView.swift
// CycleCount
//
// Created by wumeng on 2019/9/2.
// Copyright © 2019 wumeng. All rights reserved.
//
import UIKit
class BaseView: UIView {
// 这边必须使用weak
weak var superself:UIViewController?
override init(frame: CGRect) {
super.init(frame: frame);
initViews();
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
//MARK:-
func initViews() -> Void {
// 使用 [unowned self] 和 [weak self] 防止循环引用 。
// [unowned self] 是和self 共存的block 同时释放
let clickHandler:(() -> Void) = {[unowned self] in
self.WM_FUNC_block()
}
clickHandler()
// [weak self]这时候的self是可选的类型
let clickHandler1:(() -> Void) = {[weak self] in
if self != nil {
self!.WM_FUNC_block()
}
}
clickHandler1()
}
//MARK:- blcok
func WM_FUNC_block() -> Void {
}
}
使用 [unowned self] 和 [weak self] 防止循环引用 。
- [unowned self] 是和self 共存的block 同时释放,
- [weak self]这时候的self是可选的类型
网友评论