Swift中KVO(监听)的使用方法及注意事项
---恢复内容开始---
相信研究swift语言的开发者都多多少少了解或者精通Objective—C语言,熟练掌握Objective—C语言的开发者,在学习swift语言的过程中,是比较快速,而又轻松的。本人就是一位熟练掌握OC语言,后开始研究的swift。在学习swift语言的过程中,笔者建议有OC基础的开发者,在写swift的代码过程中,再写一下OC中的代码,二者相互比较,相信你能找到快速学会swift语言的方法。资深,有耐心和有天赋的开发者,相信能在一周左右,能够运用swift开发项目。其中消耗的时间,也只是个别地方的学习,了解并注意。
我这次写的是swift中的监听即KVO的用法,一开始我是先写成OC的代码,然后转化成swift的代码的。在转化过程中发现一些问题,费了一定时间去研究,去思考,去找资料。一下是swift中KVO中所需要注意的问题(仅个人测试所总结的,代码有不对之处望指正,期望共同交流)。
1,在写swift的KVO的过程中,其不能监听基本数据类型的属性,若想监听需将其改成NSNumber类型,或其它类型,否则监听的代理方法不走。
2,在写swift的KVO的过程中,被监听的属性必须用“dynamic”修饰,否则监听的代理方法不走。
3,在写swift的KVO的过程中,要保证监听者和被监听者同时存在(考虑到其生命周期)。
4,在写swift的KVO的过程中,要确保最后移除观察者,防止内存泄露。
以下是代码部分
ViewController.swift页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | // // ViewController.swift // swift监听的用法 // // Created by mac on 16/2/6. // Copyright © 2016年 ZY. All rights reserved. // import UIKit class ViewController: UIViewController { @IBOutlet weak var btn: UIButton! var _view1:NewView!; var myObject:MyNSObject!; var age:Int!; //myContext的作用,主要是区分监听对象,具体作用,科自己上网查阅资料 private var myContext = 0 override func viewDidLoad() { super .viewDidLoad() btn.addTarget( self , action: "buttonAction:" , forControlEvents: UIControlEvents.TouchUpInside); _view1 = NewView(frame: CGRectMake(100,50,100,100)); _view1.backgroundColor = UIColor.orangeColor(); self .view.addSubview(_view1); myObject = MyNSObject(); _view1.addObserver( self , forKeyPath: "age" , options: NSKeyValueObservingOptions .New, context: &myContext); // self.myObject.data = NSDate(); self ._view1.data = NSDate (); age = 10; } func buttonAction(btn : UIButton){ age = age + 10; let num = NSNumber (integerLiteral: age); self ._view1.age = num; } override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) { } override func viewDidDisappear(animated: Bool) { super .viewDidDisappear(animated); //移除监听 self .removeObserver( self , forKeyPath: "age" , context: &myContext); } } |
NewView.swift页面
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | // // NewView.swift // swift监听的用法 // // Created by mac on 16/2/6. // Copyright © 2016年 ZY. All rights reserved. // import UIKit class NewView: UIView { // 懒加载 // lazy var label:UILabel = { // let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 40)) // return label // }() //注解,,,使用监听的时候,基本数据类型,不能作为监听的属性对象,且前面必须用dynamic修饰 dynamic var age : NSNumber !; dynamic var data = NSDate (); override init(frame: CGRect) { super .init(frame: frame); } required init?(coder aDecoder: NSCoder ) { fatalError( "init(coder:) has not been implemented" ) } }<br><br>移除监听,在使用中没有dealloc方法,可以使用deinit方法替代<br>Swift技术交流群,512847147,同时Swift学习专题,与群同步,欢迎大家加入。贝尔特伦 |
---恢复内容结束---
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)