设计模式
设计模式是用来解决编程某些特定问题
单例模式
什么时候使用单例模式?
在一个工程中,有一些类只需要一个实例变量,我们就可以将这些类设计成单列模式。
单例模式的作用?
当一个’类A’被设计成单例模式时,由’A’构造出的实例对象之于其它类来讲为全局实例对象,即在每一个类中由’A’构造出的实例对象,都为相同对象。
在OC中如何将一个类设计成单例模式
1.在要被设计成单例的类的.h文件中声明一个构造单例方法,如:
+(Student *)shareInstance;
2.实现该方法
//声明一个静态实例对象,只会第一次执行
static Student *st = nil ;
+(Student *)shareInstance
{
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;
}
观察者模式
什么是观察者模式?
在工程中,一些类去观察A类,当’A类’发生变化时,这些观察类就会收到消息,做出相应反应。
什么时候使用观察者模式?
当一个类需要发送消息给多个类的时候,就用观察者模式
观察者模式的作用?
一对多的发送消息
如何在OC中实现观察者模式?
OC中观察者模式的设计基础: ‘KVC /KVO’
KVC的由来:在ios2.0之前,并没有属性来访问类中实例变量,那时候开发人员使用 ‘键值编码’ 的方式来访问类中的实例变量,即’KVC’方式。
使用KVC来访问类中实例变量:
Student *st = [[Student alloc]init];
//赋值
[st setValue:@"rick" forKey:@"_name"];
[st setValue:[NSNumber numberWithInteger:25] forKey:@"_age"];
[st setValue:@"gz" forKeyPath:@"_address"];
NSLog(@"%@",[st description]);
//访问
NSString *name = [st valueForKey:@"_name"];
NSNumber *age = [st valueForKey:@"_age"];
NSLog(@"name = %@",name);
NSLog(@"age = %@",age);
//键路径编码
Book *book = [Book new];
// st.book = book ;
// st.book.bookName = @"pdf";
[st setValue:book forKeyPath:@"_book"];
[st setValue:@"pdf" forKeyPath:@"_book._bookName"];
NSLog(@"%@",[book description]);
NSString *bookName = [st valueForKeyPath:@"_book._bookName"];
NSLog(@"%@",bookName);
KVO的由来:在编程过程中,我们经常需要判断目标是否发生改变,以便及时的做出对应的处理。此时苹果公司就提供一种策略,即’OC运行时’提供了’KVO’技术。其中’KVO’是基于’KVC’实现。
KVO的实现:
1.注册成为观看者
2.观察者定义KVO回调
3.移除观察者
代码示例: