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算是架构。

收录于网络,如有侵权,请联系小编删除


目录:iOS面试题大全

iOS面试题大全(上)

iOS面试题大全(中)

iOS面试题大全(下)

你可能感兴趣的:(iOS面试题:浅谈设计模式)