Swift中KVO(监听)的使用方法及注意事项

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>移除监听,在使用中没有
1
dealloc方法,可以使用deinit方法替代<br>Swift技术交流群,512847147,同时Swif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值