设计模式–观察者模式
设计模式是用来解决某一特定问题
1.什么是观察者模式?
在工程中,一些类去观察‘A’类,当‘A’类发生改变时,这些类就收到消息,做出相应反应。
2.什么时候使用观察者模式
当一个类需要发送消息给多个类时,就使用观察者模式
3.观察者模式的作用
一对多的消息发送
4.OC中观察者模式设计基础:KVC和KVO。
在OC中,可以通过属性或者直接设置实例变量来直接更改对象状态。也就是通过@public将类中的属性设置为公开、通过设置器setter对变量进行赋值、或者通过@property定义为类的属性再进行赋值。除了这些方法以外,还有一种方法——KVC(Key-Value Coding),KVC提供了一种在运行时而非编码时动态访问对象属性与实例变量的方法,也就是说,可以通过字符串内容作为属性名称或者实例变量名称进行访问。
1.KVC
1)在接口文件中声明三个变量
{
NSString *_name;
NSInteger _age;
}
@property(nonatomic, strong)NSString *address;
一般,通过以上方式声明的变量,其中_name,_age因为没有设置器,且作用域为private,所以一般不能在类以外对其进行设值。通过KVC的使用,则解决了这个问题。
在主函数中:
//设值
[stu1 setValue:@"Gene" forKey:@"_name"];
[stu1 setValue:@"23" forKey:@"_age"];
[stu1 setValue:@"FS" forKey:@"_address"];
//访问
NSString *name = [stu1 valueForKey:@"_name"];
NSNumber *age = [stu1 valueForKey:@"_age"];
NSString *address = [stu1 valueForKey:@"_address"];
在动态访问一些属性时,使用一些可以运行时而不是编译时改变的值,在类中定义属性p1,并创建一个方法,如果传进@“p1”,则返回p1的值。
//interface文件
-(int)getValuePropertyName:(NSString *)name{
NSNumber *number = [self valueForKey:name];
return [number intValue];
}
//main
int b = [stu1 getValuePropertyName:@"p1"];
2)键路径编码
通过setValue…forKeyPath进行设置。新建一个Book类,其中包含有属性“_bookName”;
[stu1 setValue:book forKeyPath:@"_book"];
//通过父类取出子类的值的时候,需要使用keypath
[stu1 setValue:@"悲伤逆流成河" forKeyPath:@"_book._bookName"];
NSString *bookName = [stu1 valueForKeyPath:@"_book._bookName"];