当前位置:   article > 正文

有关模式的课堂笔记

有关模式的课堂笔记

设计模式

设计模式是用来解决编程某些特定问题。

单例模式

什么时候使用单例模式?

在一个工程中,有一些类只需要一个实例变量,我们就可以将这些类设计成单例模式

单例模式的作用?

当一个类A被设计成单例模式时,由A构造出的实例对象之于其它类来讲为全局实例对象,即在每一个类中由A构造出的实例对象,都为相同对象

在OC中如何将一个类设计成单例模式?

  1. 在要被设计成单例的类的.h文件中声明一个构造单例方法,如:

    +(Student *)shareIntance;   
    
    • 1
    • 2
  2. 实现该方法

    static Student *st = nil;//声明一个静态实例对象
    +(Student *)shareIntance{
        if (st == nil) {
        st = [[Student alloc] init];
        }
        return st;
    }
    
    //为了防止通过 alloc 或 new 创建新的实例
    +(id)allocWithZone:(struct _NSZone *)zone{
        @synchronized(self){
            if (st == nil) {
          st = [[super allocWithZone:zone] init];
            }
        }
        return st;
    }
    //为了防止copy产生出新的对象,需要实现 NSCopying 协议
    -(id)copyWithZone:(NSZone *)zone{
    return self;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

观察者模式

什么是观察者模式?

在工程中,一些类去观察A类,当A类发生变化时,这些观察类就会收到消息,做出相应反应。

什么时候使用观察者模式?

当一个类需要发送消息给多个类的时候,就用观察者模式

观察者模式的作用?

一对多的发送消息

如何在OC中实现观察者模式?

OC中观察者模式的设计基础:KVC / KVO

KVC的由来:在iOS2.0之前,并没有属性来访问类中实例变量,那时候开发人员使用 键值编码 的方式来访问类中的实例变量,即 KVC方式。

使用KVC来访问类中实例变量:

Student *st = [[Student alloc] init];
//赋值
[st setValue:@"vincent" forKey:@"_name"];
[st setValue:@25 forKey:@"_age"];


//访问
NSString *name = [st valueForKey:@"_name"];
 NSNumber *age = [st valueForKey:@"_age"];

//键路径编码
Book *book = [Book new];
 //st.book = book;
//st.book.bookName = @"金品梅";

[st setValue:book forKeyPath:@"_book"];
[st setValue:@"金品梅" forKeyPath:@"_book._bookName"];

NSLog(@"%@",[book description]);

NSString *bookName = [st valueForKeyPath:@"_book._bookName"];


[st setValue:@"guangzhou" forKeyPath:@"_address"];
    NSLog(@"des = %@",[st description]);
  • 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

KVO的由来:在编程过程中,我们经常需要判断目标是否发生改变,以便及时的做出对应的处理。此时苹果公司就提供一种策略,即OC运行时提供了kVO技术。其中KVO是基于KVC实现。

KVO的实现:
1. 注册成为观察者
2. 观察者定义KVO回调
3. 移除观察者
代码示例:

-(id)initWithStudent:(Student *)st{
    if (self = [super init]) {
        self.st = st;
        //1.注册观察者
        [self.st addObserver:self forKeyPath:@"_name" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:nil];
        [self.st addObserver:self forKeyPath:@"_age" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:nil];
        [self.st addObserver:self forKeyPath:@"_book._bookName" options:NSKeyValueObservingOptionNew |NSKeyValueObservingOptionOld context:nil];

    }
    return self;
}
//注册KVO回调
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([keyPath isEqualToString:@"_name"]) {
        NSLog(@"name change = %@",change);
    }
    if ([keyPath isEqualToString:@"_age"]) {
        NSLog(@"age change = %@",change);
    }
    if ([keyPath isEqualToString:@"_book._bookName"]) {
         NSLog(@"book change = %@",change);
    }
}
//移除观察者
-(void)dealloc{
    [self.st removeObserver:self forKeyPath:@"_name" context:nil];
    [self.st removeObserver:self forKeyPath:@"_age" context:nil];
    [self.st removeObserver:self forKeyPath:@"_book._bookName" context:nil];
}
  • 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
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/282690
推荐阅读
相关标签
  

闽ICP备14008679号