国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

swift閉包的循環引用

2019-11-09 13:44:10
字體:
來源:轉載
供稿:網友

例子是一個簡單通訊錄,列表界面點擊添加聯系人按鈕跳到添加界面,添加聯系人后返回到列表界面ListVC,但是添加界面DetailVC沒有釋放

////  ListVC.swift//  contract////  Created by targetcloud on 2017/2/11.//  Copyright © 2017年 targetcloud. All rights reserved.//import UIKitclass ListVC: UITableViewController {        var personDataSource=[Person]()    override func viewDidLoad() {        super.viewDidLoad()        loadData { (list) in            PRint(list)            self.personDataSource += list            self.tableView.reloadData()        }    }        private func loadData(completion:@escaping (_ listblock: [Person])->()) ->() {        DispatchQueue.global().async {            print("正在努力加載中...")            Thread.sleep(forTimeInterval: 2)            var arrayM :[Person] = [Person]()            for i in 0..<20{                let p = Person()                p.name = "name - /(i)/(arc4random_uniform(100))"                p.phone = "138"+String(format: "%08d", arc4random_uniform(100000000))                p.title = "Boss"                arrayM.append(p)            }            DispatchQueue.main.async {                completion(arrayM)            }        }    }    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {        return personDataSource.count    }        override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)        cell.textLabel?.text = personDataSource[indexPath.row].name        cell.detailTextLabel?.text = personDataSource[indexPath.row].phone        return cell    }            @IBAction func newClick(_ sender: Any) {        performSegue(withIdentifier: "new2detail", sender: nil)    }        override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {        tableView.deselectRow(at: indexPath, animated: true)        performSegue(withIdentifier: "list2detail", sender: indexPath)    }    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {        let vc = segue.destination as! DetailVC        if let indexPath = sender as? IndexPath{            vc.person = personDataSource[indexPath.row]            vc.completionBlock = {                self.tableView.reloadRows(at: [indexPath], with: .automatic)            }        }else{//new person            vc.completionBlock = {                guard let p = vc.person else {                    return                }                self.personDataSource.insert(p, at: 0)                self.tableView.reloadData()            }        }    }}

////  DetailVC.swift//  contract////  Created by targetcloud on 2017/2/11.//  Copyright © 2017年 targetcloud. All rights reserved.//import UIKitclass DetailVC: UITableViewController {    var person : Person?    var completionBlock : (()->())?        @IBOutlet weak var nameTF: UITextField!    @IBOutlet weak var titleTF: UITextField!    @IBOutlet weak var phoneTF: UITextField!        override func viewDidLoad() {        super.viewDidLoad()        if person != nil{            nameTF.text = person?.name            phoneTF.text = person?.phone            titleTF.text = person?.title        }    }    @IBAction func saveClick(_ sender: Any) {        if person == nil{//new person            person = Person()        }                person?.name = nameTF.text        person?.phone = phoneTF.text        person?.title = titleTF.text        completionBlock?()        _=navigationController?.popViewController(animated: true)    }}以下這段代碼有問題

vc.completionBlock = {                guard let p = vc.person else {                    return                }                self.personDataSource.insert(p, at: 0)                self.tableView.reloadData()            }

正確寫法應該是

            vc.completionBlock = {[weak vc] in                guard let p = vc?.person else {                    return                }                self.personDataSource.insert(p, at: 0)                self.tableView.reloadData()            }原因:vc對completionBlock有引用,閉包代碼中又引用了vc,造成循環引用,所以使用前,要加[weak vc] in,用到vc的地方后面加?,即vc?


上一篇:WiFi驅動框架解析

下一篇:我的數據庫

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 汉源县| 三明市| 蓝山县| 阳西县| 略阳县| 奉新县| 舞钢市| 泰州市| 武威市| 崇文区| 武清区| 台北市| 客服| 都安| 博湖县| 长宁区| 永康市| 搜索| 凉山| 兰溪市| 改则县| 峡江县| 白水县| 沽源县| 无为县| 蒲城县| 西乡县| 肃南| 延津县| 忻城县| 龙陵县| 江油市| 留坝县| 灵川县| 织金县| 绥棱县| 璧山县| 垣曲县| 石渠县| 邯郸县| 扶余县|