iOS面试知识点
1 iOS基础
1.1 父类实现深拷贝时,子类如何实现深度拷贝。父类没有实现深拷贝时,子类如何实现深度拷贝。
- 深拷贝同浅拷贝的区别:浅拷贝是指针拷贝,对一个对象进行浅拷贝,相当于对指向对象的指针进行复制,产生一个新的指向这个对象的指针,那么就是有两个指针指向同一个对象,这个对象销毁后两个指针都应该置空。深拷贝是对一个对象进行拷贝,相当于对对象进行复制,产生一个新的对象,那么就有两个指针分别指向两个对象。当一个对象改变或者被销毁后拷贝出来的新的对象不受影响。 
- 实现深拷贝需要实现NSCoying协议,实现- (id)copyWithZone:(NSZone *)zone 方法。当对一个property属性含有copy修饰符的时候,在进行赋值操作的时候实际上就是调用这个方法。 
- 父类实现深拷贝之后,子类只要重写copyWithZone方法,在方法内部调用父类的copyWithZone方法,之后实现自己的属性的处理 
- 父类没有实现深拷贝,子类除了需要对自己的属性进行处理,还要对父类的属性进行处理。 
1.2 KVO,NSNotification,delegate及block区别
- KVO就是cocoa框架实现的观察者模式,一般同KVC搭配使用,通过KVO可以监测一个值的变化,比如View的高度变化。是一对多的关系,一个值的变化会通知所有的观察者。
- NSNotification是通知,也是一对多的使用场景。在某些情况下,KVO和NSNotification是一样的,都是状态变化之后告知对方。NSNotification的特点,就是需要被观察者先主动发出通知,然后观察者注册监听后再来进行响应,比KVO多了发送通知的一步,但是其优点是监听不局限于属性的变化,还可以对多种多样的状态变化进行监听,监听范围广,使用也更灵活。 
- delegate 是代理,就是我不想做的事情交给别人做。比如狗需要吃饭,就通过delegate通知主人,主人就会给他做饭、盛饭、倒水,这些操作,这些狗都不需要关心,只需要调用delegate(代理人)就可以了,由其他类完成所需要的操作。所以delegate是一对一关系。 
- block是delegate的另一种形式,是函数式编程的一种形式。使用场景跟delegate一样,相比delegate更灵活,而且代理的实现更直观。 
- KVO一般的使用场景是数据,需求是数据变化,比如股票价格变化,我们一般使用KVO(观察者模式)。delegate一般的使用场景是行为,需求是需要别人帮我做一件事情,比如买卖股票,我们一般使用delegate。 
 Notification一般是进行全局通知,比如利好消息一出,通知大家去买入。delegate是强关联,就是委托和代理双方互相知道,你委托别人买股票你就需要知道经纪人,经纪人也不要知道自己的顾客。Notification是弱关联,利好消息发出,你不需要知道是谁发的也可以做出相应的反应,同理发消息的人也不需要知道接收的人也可以正常发出消息。
1.3 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 如何重写类方法
- 1、在子类中实现一个同基类名字一样的静态方法
- 2、在调用的时候不要使用类名调用,而是使用[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指向的对象没有这个方法,该崩溃还是会崩溃的。 
- 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
iOS面试知识点的更多相关文章
- 前端开发面试知识点大纲--摘自jackyWHJ
		前端开发面试知识点大纲:HTML&CSS: 对Web标准的理解.浏览器内核差异.兼容性.hack.CSS基本功:布局.盒子模型.选择器优先级及使用.HTML5.CSS3.移动端适应 Ja ... 
- IOS面试攻略
		IOS面试攻略(1.0) 2013-10-13 20:58:09| 分类: IOS面试 | 标签:ios知识点总汇 ios面试 |举报|字号 订阅 来自:伊甸网 @ 看到这个关键字,我 ... 
- ios面试技术要点
		iOS面试 技术总结点(可参考):多线程 运行时 runloop app框架 几种动画编程 jsonmodel原理 sdwebimage原理 masonry怎么应用及原理 应用框架有哪些 说一下Fac ... 
- iOS 面试基础题目
		转载: iOS 面试基础题目 题目来自博客:面试百度的记录,有些问题我能回答一下,不能回答的或有更好的回答我放个相关链接供参考. 1面 Objective C runtime library:Obje ... 
- iOS 常见知识点(三):Lock
		iOS 常见知识点(一):Runtime iOS 常见知识点(二):RunLoop 锁是最常用的同步工具.一段代码段在同一个时间只能允许被有限个线程访问,比如一个线程 A 进入需要保护代码之前添加简单 ... 
- Java---常用基础面试知识点
		综合网上的一点资源,给大家整理了一些Java常用的基础面试知识点,希望能帮助到刚开始学习或正在学习的学员. 1.抽象 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方 ... 
- iOS面试贴士
		iOS面试小贴士 ———————————————回答好下面的足够了------------------------------------- 多线程.特别是NSOperation 和 GCD 的内部原 ... 
- C C++ OC iOS面试重点问题(一)
		C C++ OC iOS面试重点问题(一) 1.字符串常量需要加\0 2.逻辑运算 位操作(经典:实现两个数的交换) 3.关键字 4.引用和指针的区别和联系 5.如何引用一个已经定义过的全局变量? ... 
- IOS面试问题总结
		IOS面试问题总结 分类: IOS开发2013-11-20 17:26 10458人阅读 评论(1) 收藏 举报 目录(?)[+] 通过网络搜寻和自己总结经历找了一些IOS面试经常被问道的问题 ... 
随机推荐
- python RabbitMQ队列使用(入门篇)
			---恢复内容开始--- python RabbitMQ队列使用 关于python的queue介绍 关于python的队列,内置的有两种,一种是线程queue,另一种是进程queue,但是这两种que ... 
- HttpServletRequest对象方法的用法(转)
			原文地址:http://blog.csdn.net/xh16319/article/details/8450715 原文作者:ITSTAR 文章太赞,忍不住就想转..... 1. 获得客户机信息 ... 
- Team Queue(多队列技巧处理)
			Team Queue Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ... 
- WebSphere性能优化的几个方法
			1.更改http server的配置文件参数KeepAlive. 原因:这个值说明是否保持客户与HTTP SERVER的连接,如果设置为ON,则请求数到达MaxKeepAliveRequest ... 
- Html与css基础
			1.html的定义 (1).html:超文本标记语言(HyperText Markup Language),它主要包括"头"(Head)和"主体"(Body)两 ... 
- JS高级程序设计学习笔记之JS事件(1)
			事件流 冒泡 定义:事件开始时由最具体的元素接收,然后逐级上传到较为不具体的节点.(IE9.FF.Chrome.Safari会将事件一直冒泡到window对象.IE5.5及其以下会跳过<html ... 
- linux syslog详解
			linux syslog详解 分三部分 一.syslog协议介绍 二.syslog函数 三.linux syslog配置 一.syslog协议介绍 1.介绍 在Unix类操作系统上,syslog广 ... 
- Python爬虫——抓取贴吧帖子
			抓取百度贴吧帖子 按照这个学习教程,一步一步写出来,中间遇到很多的问题,一一列举 首先, 获得 标题 和 贴子总数 # -*- coding:utf-8 -*- #!/user/bin/python ... 
- CentOS  FTP服务器权限控制
			在默认配置下,本地用户登入FTP后可以使用cd命令切换到其他目录,这样会对系统带来安全隐患.可以通过以下三条配置文件来控制用户切换目录. chroot_list_enable=YES/NO(NO) 设 ... 
- Java Load Properties 文件,定义message信息
			初始化Properties对象,load properties文件: private static final Properties MESSAGERESOURCES = new Properties ... 
