iOS面试题:浅谈设计模式
创建型模式:
-
单例模式:在整个应用程序中,共享一份资源。保证在程序运行过程中,一个类只有一个实例,而且该实例只提供一个全局访问点供外界访问,从而方便控制实例个数,节约系统资源。
优点是:提供了对唯一实例的受控访问、可扩展、避免频繁创建销毁对象影响性能。
缺点是:延长了声明周期,一直存在占用内存。如果两个单例循环依赖会造成死锁,所以尽量不去产生单例间的依赖关系。 -
工厂方法模式:通过类继承创建抽象产品,创建一种产品,子类化创建者并重载工厂方法以创建新产品。
-
抽象工厂模式:通过对象组合创建抽象产品,可以创建多系列产品,必须修改父类的接口才能支持新的产品。
结构型模式:
-
代理模式:代理用来处理事件的监听和参数传递。
@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 = @"13901234567";
// 注意:设置参数的索引时不能从0开始,因为0已经被self占用,1已经被_cmd占用
[invocation setArgument:&phone atIndex:2]; // 参数:可以添加任意数量的参数。
NSString *name = @"9527";
[invocation setArgument:&name atIndex:3];
/*
注:调用invocation的invoke方法,就代表需要执行NSInvocation对象中指定对象的指定方法,并且传递指定的参数
*/
[invocation invoke];
}
- (void)sendMessageWithPhone:(NSString*)phone WithName:(NSString*)name {
NSLog(@"电话号=%@, 姓名=%@",phone, name);
}
// 电话号=13901234567, 姓名9527
- MVC和MVVM算是架构。
收录于网络,如有侵权,请联系小编删除