iOS问题整理回答

作者 汪小祯 日期 2016-10-09
iOS
iOS问题整理回答

感觉自己基础不够老实,网上找了一些别人的面试题,自己搜集了一些资料,来回答。

学习路线

原文地址

OC 中load方法和initialize方法的异同。

load
被程序装载时调用,main之前
父类->子类->分类
如果一个类没有实现load方法,那么就不会调用它父类的load方法
根据编译顺序

initializez
第一次给某个类发送消息时调用,惰性调用
如果子类实现了initialize方法,就不会执行父类的了,直接执行子类本身的。如果分类实现了initialize方法,也不会再执行主类的。所以initialize方法的执行覆盖顺序是 分类 -> 子类 ->类。且只会有一个initialize方法被执行。
建议学习

说说你对 block 的理解

面试题集合

原文地址/)

去哪儿网一面

1.自我介绍

2.atomic 和 nonatomic 的区别

前者是原子性,后者是非原子型。两者的区别在于一个加锁,比如说一个属性,同时几个线程在读和写,那么atomic能保证其不受到其他线程的影响。但不能保证线程安全,比如说线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,3种都有可能。
从代码角度解释
非原子型

//@property(nonatomic, retain) UITextField *userName;
//系统生成的代码如下:
- (UITextField *) userName {
return userName;
}
- (void) setUserName:(UITextField *)userName_ {
[userName_ retain];
[userName release];
userName = userName_;
}

原子型

//@property(retain) UITextField *userName;
//系统生成的代码如下:
- (UITextField *) userName {
UITextField *retval = nil;
@synchronized(self) {
retval = [[userName retain] autorelease];
}
return retval;
}
- (void) setUserName:(UITextField *)userName_ {
@synchronized(self) {
[userName release];
userName = [userName_ retain];
}
}

建议阅读:
atomic 和 nonatomic 有什么区别?
关于 @synchronized,这儿比你想知道的还要多

3.手写@property (nonatomic, strong, readonly) NSString *context 的get 方法。前提是线程安全,lazy load的方式

@synthesize context4=_context4;
-(NSString*)context4{
return _context4;
}

4.@property (atomic, strong) NSString *str; 如果重写了str的set方法,那atomic还有效吗?

get方法中的同步锁@synchronized还有,但是无法保证set了。

5.写一个method 能满足输入[6, 5, 4, 3, 2, 1]数组 输出 [1, 2, 3, 4, 5, 6]数组

6.http socket的区别,http是在网络里面的那一层。这里考的是网络传输的那7层。如何知道消息体的数据已经发送完成了。tcp udp的理解。

http socket的区别?
http在应用层

建议阅读:
TCP/IP SOCKET HTTP及HTTPS之间的关系及各自特性之总结

7.一个新的app的设计思路,主要看架构方面的想法

8.多个登录方式,比如qq, 微信,微博,手机号,邮箱等的登录,如果真对变化进行封装。这里考虑的更多的是设计模式上的问题。

9.事件响应链(比如点击事件)

史上最详细的iOS之事件的传递和响应机制-原理篇

10.GCD中group的优点,及串行,并行队列

获知所有线程的完成情况
串行队列: 线程任务按先后顺序逐个执行
并行队列: 多个任务按添加顺序一起开始执行

11.framework时动态链接库还是静态链接库,和.a的区别是什么

.a静态库是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件
.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用(内部直接包含了要展示方法的.h文件)。

静态库:以.a 和 .framework为文件后缀名。
动态库:以.tbd(之前叫.dylib) 和 .framework 为文件后缀名。

静态库:链接时会被完整的复制到可执行文件中,被多次使用就有多份拷贝。
动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用(如系统的UIKit.framework等),节省内存。

12.将对象加入字典,array时的引用计数是多少

13.weak的实现原理 strong的实现原理

14.关于引用计数的知识点

15.手写一个set方法

16.block中的弱引用强引用,什么情况会导致循环引用,什么时候需要__strong保持强引用

block中引用self会造成循环引用

17.app的性能优化,都有哪些

18.对于image加载的优化方案有哪些

19.Runloop, runtime的理解

计算机网络问题整理

  1. 简要说明交换机,路由器的工作原理及它们之间的区别?
  • 层不同:路由器在OSI的第三层–网络层,而交换机在第二层–数据链路层;
  • 表不同:路由器有一张路由器表,而交换机有一张桥表;
  • 功能不同:路由器是不同网段之间的连接设备,主要有路由选择、拥塞控制、存储转发功能;;交换机只有扩展延伸同一网络更多终端的作用。
  • 协议不同:路由器用的协议多与软件有关,交换机所用协议多与硬件接口有关。
  • 作用地址不同:路由器针对的地址是IP地址,可以用静态分配和动态分配,是变化的;而交换机作用地址是MAC地址,这是设备厂商出厂时就固化在设备中的,只能有一个,不能变化。

2.描述TCP 协议三次握手,四次释放的过程

三次握手:
1.客户端请求连接,会发送一个SYN序列号。
2.服务端发送一个针对上次SYN序号的应答确认号ACK,和一个SYN序列号。
3.客户端发送一个针对上次SYN序号的应答确认号ACK。
四次握手:
1.客户端请求断开连接,会发送一个FIN序号。
2.服务端发送一个针对上次FIN序号的应答确认号ACK。
3.服务端发送一个FIN序号请求断开连接。
4.客户端发送一个针对上次服务端FIN序号的应答确认号ACK。

3.TCP 协议是如何进行流量控制,拥塞控制的?

  • TCP流量控制原理
    运用TCP报文段中的窗口大小字段来控制,发送方的发送窗口不可以大于接收方发回的窗口大小。

4.为什么建立连接时是三次握手,两次行不行?如果第三次握手失败了怎么处理

  • 如果只有两次的话,假如第二次服务端发送完ack就开始传送信息,此时不知道客户端是否可以收到
  • 假如之前客户端已经请求了一次,但是没有到服务端。之后又请求了一次,得到回复开始传信息然后结束。此时上一次的那个请求才到达客户端。
  • 如果第三次握手失败后发送RST报文段,进入CLOSED状态

5.你怎么理解分层和协议?

  • 每层的提供的服务是固定的,所以每一层改变的时候,不会影响其他层次。
    比如数据链路层是以太网、令牌环网,他们都能支持IP协议。而应用层的传输协议既可以使用TCP协议,也可以使用UDP协议。分层也使每一层的功能单一。
  • 协议是两个通信的主体达成一致的通信规则,windows、linux都支持TCP/IP,他们就能通过TCP/IP通信。

6.HTTP 请求中的 GET 和 POST 的区别

  • 请求方式:Get请求数据会放在Url之后,POST会放在HTTP请求的包体中。
  • 传输数据大小,GET请求会受到URL长度限制,POST理论上不受限制,但服务器会对提交大小进行限制
  • 安全性,POST请求安全性比GET高

7.Session 和 Cookie 的区别。

1,session 在服务器端,cookie 在客户端(浏览器)
2,session 默认被存在在服务器的一个文件里(不是内存)
3,session 的运行依赖 session id,而 session id 是存在 cookie 中的,也就是说,如果浏览器禁用了 cookie ,同时 session 也会失效(但是可以通过其它方式实现,比如在 url 中传递 session_id)
4,session 可以放在 文件、数据库、或内存中都可以。
5,用户验证这种场合一般会用 session

8.谈谈你对 HTTP 1.1,2.0 和 HTTPS 理解