小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
创建型模式:
-
单例模式: 在整个应用程序中,共享一份资源。保证在程序运行过程中,一个类只有一个实例,而且该实例只提供一个全局访问点供外界访问,从而方便控制实例个数,节约系统资源。
优点是: 提供了对唯一实例的受控访问、可扩展、避免频繁创建销毁对象影响性能。
缺点是: 延长了声明周期,一直存在占用内存。如果两个单例循环依赖会造成死锁,所以尽量不去产生单例间的依赖关系。
-
工厂方法模式: 通过类继承创建抽象产品,创建一种产品,子类化创建者并重载工厂方法以创建新产品。
-
抽象工厂模式: 通过对象组合创建抽象产品,可以创建多系列产品,必须修改父类的接口才能支持新的产品。
结构型模式:
- 代理模式: 代理用来处理事件的监听和参数传递。
@required
修饰必须实现这个协议方法方法,@optional
修饰是可选实现。使用方法时最好先判断方法是否实现respondsToSelector:
,避免找不到方法而崩溃。
delegate和block、Notification对比优缺点: delegate和block是一对一通信、block比delegate更加简洁清晰,但是如果通信事件较多时delegate运行成本较低且不易造成循环引用;通知适合一对多通信,代码清晰简单,但问题查找溯源会比较困难,并且注册通知要注意在合适的时间移除,避免对野指针发送消息引起崩溃(**注意:**iOS9之后已经做了弱引用处理不需要移除了,之前版本使用不安全引用__unsafe_unretained是为了兼容旧版本)。
- 类簇: 类簇在公共抽象超类下对多个私有的具体子类进行分组。以这种方式对类进行分组简化了面向对象框架的公共可见体系结构,而不会降低其功能丰富度。类簇是基于抽象工厂设计模式的。
- 装饰模式: 在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。如:分类。
- 享元模式:使用共享物件,减少同一类对象的大量创建。如: UITableviewCell复用。
行为型模式:
- 观察者模式: 其本质上是一种
发布-订阅
模型,用来消除具有不同行为的对象之间的耦合,通过这一模式,不同对象可以协同工作。如:KVO。 - 命令模式: 是一种将方法调用封装为对象的设计模式,在iOS中具体实现为NSInvocation。下边为
NSInvocation
的实现代码。
- (void)viewDidLoad {
NSMethodSignature *signature = [ViewController instanceMethodSignatureForSelector:@selector(sendMessageWithPhone:WithName:)]; // 方法签名:用来获得方法的返回类型和参数类型
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
invocation.target = self; // 目标:接收消息的对象
invocation.selector = @selector(sendMessageWithPhone:WithName:); // 选择器:被发送的消息, 方法必须和签名中的方法一致。
NSString *phone = @"13512345678";
// 注意:设置参数的索引时不能从0开始,因为0已经被self占用,1已经被_cmd占用
[invocation setArgument:&phone atIndex:2]; // 参数:可以添加任意数量的参数。
NSString *name = @"Dezi";
[invocation setArgument:&name atIndex:3];
/*
注:调用invocation的invoke方法,就代表需要执行NSInvocation对象中指定对象的指定方法,并且传递指定的参数
*/
[invocation invoke];
}
- (void)sendMessageWithPhone:(NSString*)phone WithName:(NSString*)name {
NSLog(@"电话号=%@, 姓名=%@",phone, name);
}
// 电话号=13512345678, 姓名Dezi
- MVC和MVVM算是架构。