iOS面试知识点

1 iOS基础

1.1 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。

  • 深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,至关于对指向对象的指针进行复制,产生一个新的指向这个对象的指针,那么就是有两个指针指向同一个对象,这个对象销毁后两个指针都应该置空。深拷贝是对一个对象进行拷贝,至关于对对象进行复制,产生一个新的对象,那么就有两个指针分别指向两个对象。当一个对象改变或者被销毁后拷贝出来的新的对象不受影响。html

  • 实现深拷贝须要实现NSCoying协议,实现- (id)copyWithZone:(NSZone *)zone 方法。当对一个property属性含有copy修饰符的时候,在进行赋值操做的时候实际上就是调用这个方法。ios

  • 父类实现深拷贝以后,子类只要重写copyWithZone方法,在方法内部调用父类的copyWithZone方法,以后实现本身的属性的处理算法

  • 父类没有实现深拷贝,子类除了须要对本身的属性进行处理,还要对父类的属性进行处理。编程

1.2 KVO,NSNotification,delegate及block区别

  • KVO就是cocoa框架实现的观察者模式,通常同KVC搭配使用,经过KVO能够监测一个值的变化,好比View的高度变化。是一对多的关系,一个值的变化会通知全部的观察者。
  • NSNotification是通知,也是一对多的使用场景。在某些状况下,KVO和NSNotification是同样的,都是状态变化以后告知对方。NSNotification的特色,就是须要被观察者先主动发出通知,而后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,可是其优势是监听不局限于属性的变化,还能够对多种多样的状态变化进行监听,监听范围广,使用也更灵活。swift

  • delegate 是代理,就是我不想作的事情交给别人作。好比狗须要吃饭,就经过delegate通知主人,主人就会给他作饭、盛饭、倒水,这些操做,这些狗都不须要关心,只须要调用delegate(代理人)就能够了,由其余类完成所须要的操做。因此delegate是一对一关系。设计模式

  • block是delegate的另外一种形式,是函数式编程的一种形式。使用场景跟delegate同样,相比delegate更灵活,并且代理的实现更直观。安全

  • KVO通常的使用场景是数据,需求是数据变化,好比股票价格变化,咱们通常使用KVO(观察者模式)。delegate通常的使用场景是行为,需求是须要别人帮我作一件事情,好比买卖股票,咱们通常使用delegate。
    Notification通常是进行全局通知,好比利好消息一出,通知你们去买入。delegate是强关联,就是委托和代理双方互相知道,你委托别人买股票你就须要知道经纪人,经纪人也不要知道本身的顾客。Notification是弱关联,利好消息发出,你不须要知道是谁发的也能够作出相应的反应,同理发消息的人也不须要知道接收的人也能够正常发出消息。网络

1.3 KVC若是实现,如何进行键值查找。KVO如何实现

请看这两篇博文 KVC KVO数据结构

1.4 将一个函数在主线程执行的4种方法

  • GCD方法,经过向主线程队列发送一个block块,使block里的方法能够在主线程中执行。
dispatch_async(dispatch_get_main_queue(), ^{ //须要执行的方法 });
  • NSOperation 方法
NSOperationQueue *mainQueue = [NSOperationQueue mainQueue]; //主队列 NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{ //须要执行的方法 }]; [mainQueue addOperation:operation];
  • NSThread 方法
[self performSelector:@selector(method) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES modes:nil]; [self performSelectorOnMainThread:@selector(method) withObject:nil waitUntilDone:YES]; [[NSThread mainThread] performSelector:@selector(method) withObject:nil];
  • RunLoop方法
[[NSRunLoop mainRunLoop] performSelector:@selector(method) withObject:nil]; 

1.5 如何让计时器调用一个类方法

  • 计时器只能调用实例方法,可是能够在这个实例方法里面调用静态方法。
  • 使用计时器须要注意,计时器必定要加入RunLoop中,而且选好model才能运行。scheduledTimerWithTimeInterval方法建立一个计时器并加入到RunLoop中因此能够直接使用。
  • 若是计时器的repeats选择YES说明这个计时器会重复执行,必定要在合适的时机调用计时器的invalid。不能在dealloc中调用,由于一旦设置为repeats 为yes,计时器会强持有self,致使dealloc永远不会被调用,这个类就永远没法被释放。好比能够在viewDidDisappear中调用,这样当类须要被回收的时候就能够正常进入dealloc中了。
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerMethod) userInfo:nil repeats:YES]; -(void)timerMethod { //调用类方法 [[self class] staticMethod]; } -(void)invalid { [timer invalid]; timer = nil; }

1.6 如何重写类方法

  • 一、在子类中实现一个同基类名字同样的静态方法
  • 二、在调用的时候不要使用类名调用,而是使用[self class]的方式调用。原理,用类名调用是早绑定,在编译期绑定,用[self class]是晚绑定,在运行时决定调用哪一个方法。

1.7 NSTimer建立后,会在哪一个线程运行。

  • 用scheduledTimerWithTimeInterval建立的,在哪一个线程建立就会被加入哪一个线程的RunLoop中就运行在哪一个线程
  • 本身建立的Timer,加入到哪一个线程的RunLoop中就运行在哪一个线程。

1.8 id和NSObject*的区别

  • id是一个 objc_object 结构体指针,定义是
typedef struct objc_object *id
  • id能够理解为指向对象的指针。全部oc的对象 id均可以指向,编译器不会作类型检查,id调用任何存在的方法都不会在编译阶段报错,固然若是这个id指向的对象没有这个方法,该崩溃仍是会崩溃的。app

  • NSObject *指向的必须是NSObject的子类,调用的也只能是NSObjec里面的方法不然就要作强制类型转换。

  • 不是全部的OC对象都是NSObject的子类,还有一些继承自NSProxy。NSObject *可指向的类型是id的子集。

个人理解若是有错漏请必定指出,很是感谢!

如下内容后续补充

iOS 核心框架

  • CoreAnimation
  • CoreGraphics
  • CoreLocation
  • AVFoundation
  • Foundation

iOS核心机制

  • UITableView 重用
  • ObjC内存管理;自动释放池,ARC如何实现
  • runloop
  • runtime
  • Block的定义、特性、内存区域、如何实现
  • Responder Chain
  • NSOperation
  • GCD

数据结构

  • 8大排序算法
  • 二叉树实现
  • 二分查找实现

面向对象编程

  • 封装、继承、多态

  • 设计模式6个原则

  • 设计一个类的功能,如何划分粒度(单一职责)

  • 接口隔离。

  • 若是有一个鸟类,有飞的动做,一个鸵鸟继承它是合适的吗(里氏替换)

  • 类之间的依赖如何依赖偶合度最小(依赖倒转)
    高层依赖低层,低层不能依赖高层。依赖接口,不能依赖具体的类。

  • 若是A要调用C函数,但C是B的成员类,应该如何设计?(迪米特)

  • 如何设计类,能作到只增长代码,而不修改代码,有哪些经验(开放封闭)
    经过设计模式解决。

计算机技术

  • 计算机网络: TCP/IP、HTTPCDN、SPDY
  • 计算机安全: RSA、AES、DES
  • 操做系统:线程、进程、堆栈、死锁、调度算法

iOS新特性、新技术

    • iOS7 UIDynamic、SpritKit、新布局、扁平化
    • iOS8 应用程序扩展、HealthKit、SceneKit、CoreLocation、TouchID、PhotoKit
    • iOS9
    • Apple Watch
    • 第三方库:SDWebImage、AFNetwork、JSONKit、wax
    • swift