麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開(kāi)發(fā)設(shè)計(jì) > 正文

swift閉包的循環(huán)引用

2019-11-09 14:22:46
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

例子是一個(gè)簡(jiǎn)單通訊錄,列表界面點(diǎn)擊添加聯(lián)系人按鈕跳到添加界面,添加聯(lián)系人后返回到列表界面ListVC,但是添加界面DetailVC沒(méi)有釋放

////  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)    }}以下這段代碼有問(wèn)題

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

正確寫法應(yīng)該是

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


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 制服丝袜成人动漫 | 亚洲成人福利在线观看 | 一区二区高清视频在线观看 | 人人玩人人爽 | 国产精品视频导航 | 久久精品com | 羞羞的网站 | 日本视频免费看 | 99精彩视频在线观看 | 国产一级毛片网站 | 成人在线视频播放 | av电影免费观看 | 久草欧美 | 91精品久久久久久久久久久 | 亚洲成人激情在线 | 成人一区二区在线观看视频 | 国产高潮国产高潮久久久91 | 成人免费毛片片v | 国产一国产一级毛片视频 | 黄网站免费入口 | 免费看日产一区二区三区 | 免费观看高清视频网站 | 蜜桃一本色道久久综合亚洲精品冫 | 91精品国产九九九久久久亚洲 | 久久久久久久免费精品 | 久久久一区二区精品 | 国产精品视频一区二区三区四区国 | 欧美一区二区三区免费不卡 | 欧美一极视频 | 精品久久久久久久久久久久包黑料 | 九九热在线精品视频 | 欧美成人精品一级 | 国产羞羞视频在线观看免费应用 | 一区二区三区视频在线 | 国产亚洲精品久久久久久网站 | 日本在线视频二区 | 久久国产免费 | 国产成人精品午夜视频' | 一区二区三区日韩 | 欧美日韩电影 | 国产免费成人 |