1、自我介绍。
2、浅拷贝和深拷贝的区别?
注意:只有不可变的类型用了copy测试浅拷贝,其他都是深拷贝。
深拷贝,产生新的对象,开辟新的内存空间
浅拷贝,不产生新的对象,不开辟新的内存空间,只是把指针指向原来对象的内存地址。
意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了两份独立对象本身。
2、OC中属性修饰词有哪些,分别有什么作用?
答案:assign、weak、strong、retain、copy、nonatomic、atomic、readonly、readwrite
3、frame和bounds 有什么不同?
答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)bounds指的是:该view在本身坐标系统中的位置和大小。(参照点是本身坐标系统)bounds指的是以自己为原点的坐标系。父视图bouns改变,子视图会移动。
4、0bjective-C 的类可以多重继承么?可以实现多个接口么? Category 是什么?重写一个类的方式用继承好还是分类好?为什么?
答案:Objective-c只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,cocoa中所有的类都是NSObject 的子类,多继承在这里是用protocol委托代理来实现的。
Category是类别,一般用分类比较好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系
5、Category (类别)、Extension (扩展)和继承的区别?
答案:类扩展 Extension 可以为类添加属性和方法。
类别 Category 只能添加方法不能添加属性,添加属性调用的时候会 Crash,因为并不会为类 Category 的属性生成 Get 和 Set 方法。
6、什么时候用delete, 什么时候用Notification?
答案:delegate(委托模式):1对1的反向消息通知功能。
Notification(通知模式):只想要把消息发送出去,告知某些状态的变化。但是并不关心谁想要知道这个。
7、 什么是TCP / UDP?
答案:
(1)TCP的全称为传输控制协议。这种协议可以提供面向连接的、可靠的、点到点的通信。,是面向连接的,建立连接需要经历三次握手,保证数据正确性和数据顺序。
TCP传输数据的形式:点对点传输数据 传输过程比较复杂 但是比较安全 不会出现丢包的现象(比如:QQ文件传输)
(2)UDP全称为用户数据报协议,它可以提供非连接的不可靠的点到多点的通信。是非连接的协议
UDP传输数据的形式:点对面传输数据 传输过程非常简单 但是比较不安全 经常出现丢包的现象 传输方只管传输不管接收方是否接受成功(比如:短信群发)
IP 由46位(0255之间的数字组成) 作为设备的唯一标识
(3)TCP 的三次握手
第一次握手:客户端发送 syn 包到服务器,并进入 syn_send状态,等待服务器进行确认;
第二次握手:服务器收到客户端的 syn 包,必须确认客户的SYN,同时自己也发送一个 SYN 包,即 SYN + ACK 包,此时服务器进入 SYN_RECV 状态;
第三次握手:客户收到服务器发送的 SYN+ACK 包之后,向服务器发送确认包, 此包发送完毕,客户端和服务器进入ESTABLISHED 状态,完成第三次握手。
8.ViewController生命周期
按照执行顺序排列:
initWithCoder:通过nib文件初始化时触发。
awakeFromNib:nib文件被加载的时候,会发生一个awakeFromNib的消息到nib文件中的每个对象。
loadView:开始加载视图控制器自带的view。
viewDidLoad:视图控制器的view被加载完成。
viewWillAppear:视图控制器的view将要显示在window上。
updateViewConstraints:视图控制器的view开始更新AutoLayout约束。
viewWillLayoutSubviews:视图控制器的view将要更新内容视图的位置。
viewDidLayoutSubviews:视图控制器的view已经更新视图的位置。
viewDidAppear:视图控制器的view已经展示到window上。
viewWillDisappear:视图控制器的view将要从window上消失。
viewDidDisappear:视图控制器的view已经从window上消失。
9.如何对iOS设备进行性能测试?
答: Profile-> Instruments ->Time Profiler
开发项目时你是怎么检查内存泄露?
1). 静态分析 analyze。
2). instruments工具里面有个leak可以动态分析。
10、谈谈 UITableView 的优化
(1). 正确的复用cell。
(2). 设计统一规格的Cell
(3). 提前计算并缓存好高度(布局),因为heightForRowAtIndexPath:是调用最频繁的方法;
(4). 异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;
(4). 滑动时按需加载,这个在大量图片展示,网络加载的时候很管用!
(5). 减少子视图的层级关系。
(6). 尽量使所有的视图不透明化以及做切圆操作。
(7). 不要动态的add 或者 remove 子控件。最好在初始化时就添加完,然后通过hidden来控制是否显示。
(8). 使用调试工具分析问题。
11、.什么是 KVO 和 KVC?KVO底层实现原理
KVO是基于runtime机制实现的
当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制
如果原类为Person,那么生成的派生类名为NSKVONotifying_Person
每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法
键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey:一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey:会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。
补充:KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类
12、在项目中,若出现以下的代码可能会有什么问题?(10分)
for(int i=0;i< 1000;i++) {
NSString *num = [NSString stringWithFormat:@"%d",i];//num是临时变量
}
答案:大次数循环内存暴涨问题。
该循环内产生大量的临时对象,直至循环结束才释放,可能导致内存泄漏,解决方法为在循环中创建自己的autoReleasePool,及时释放占用内存大的临时变量,减少内存占用峰值。
13、runtime如何实现weak变量的自动置nil?
答案:runtime 对注册的类, 会进行布局,对于 weak 对象会放入一个 hash 表中。 用 weak 指向的对象内存地址作为 key,当此对象的引用计数为0的时候会 dealloc,假如 weak 指向的对象内存地址是a,那么就会以a为键, 在这个 weak 表中搜索,找到所有以a为键的 weak 对象,从而设置为 nil。
14、项目中那些地方用过runtime?
15、GET方法和POST对比
优点:GET:
使用方便,直接访问主机上面的某一个资源文件即可拿到我们想要的数据
请求过程当中除了往服务器发送请求头以外,不会发送任何请求体的东西,也就是说不会破坏服务器的封装性,从这个角度来讲,GET是安全的
POST:
POST请求方式除了向服务器发送请求头信息以外,还将类似GET方法里面的参数封装成请求体发送给服务器,在整个请求过程中,我们看不到参数的信息,从这个角度来讲,POST相对于GET是安全的
POST向服务器请求数据或者发送数据时,请求体的大小远远超过GET方式拼接的参数的大小,使用比较灵活。
缺点:GET:
当访问的时候,参数暴露在外面,任何人都可以看见参数信息,从这种角度来讲,相对POST来说不安全
通过GET方式拼接参数向服务器发送请求时,浏览器里面网址的长度有上限
POST:
使用相对来说没有GET便捷
POST请求过程中,除了往服务器发送请求头信息以外,还需要给服务器发送请求体,从这个角度来讲,破坏了服务器的封装性,POST相对GET是不安全的
15、项目上架流程,推送?
——>熟悉SVN吗?
——>工作中遇到过的难点,怎么解决的?
——>对于我们公司你还有什么想了解的?