workiOS精品文章-面试面试题库

iOS--面试划重点了

2017-02-06  本文已影响2962人  爱吃鱼的小灰

一、关于@property先思考一下几个问题

delegate 属性为什么使用 weak ?
xib/storybard连接的对象为什么使用weak?
字符串  为什么使用copy?
Block 为什么使用 copy?
1.答:delegate用weak修饰是为了避免循环引用
2.答:因为控件他“爹”view.superview已经strong reference(牵着他
滴小手了),你的viewController 只需要weak reference就好了
3.答:因为通常都是使用copy的方式。虽然使用strong也没有没有
问题,但是事实上在开发中都会使用copy。为什么这么做?因为对
于字符串,我们希望是一次内容的拷贝,外部修改也不会影响我们
的原来的值,而且NSString类遵守了NSCopying, 
NSMutableCopying, NSSecureCoding协议。
4.答:block一开始是放在栈上的,只有copy后才会放到堆上

@Property是声明属性的语法,它可以快速方便的为实例变量创建存取器,并允许我们通过点语法使用存取器。

原子性

1、atomic(默认):atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。
2、nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。

存取器控制

readwrite(默认):readwrite是默认值,表示该属性同时拥有setter和getter。
readonly: readonly表示只有getter没有setter。

内存管理

assign(默认):assign用于值类型,如int、float、double和NSInteger,CGFloat等表示单纯的复制。还包括不存在所有权关系的对象,比如常见的delegate。
retain:在setter方法中,需要对传入的对象进行引用计数加1的操作。简单来说,就是对传入的对象拥有所有权,只要对该对象拥有所有权,该对象就不会被释放。(现在基本不用因为都是ARC机制)如下代码所示:

- (void)setName:(NSString *)_name
{ 
   //首先判断是否与旧对象一致,如果不一致进行赋值。
   //因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的。 
    if ( name != _name){
           [name release];
           name = [_name retain];
     } 
}

strong:strong是在iOS引入ARC的时候引入的关键字,是retain的一个可选的替代。表示实例变量对传入的对象要有所有权关系,即强引用.

weak:在setter方法中,需要对传入的对象不进行引用计数加1的操作。简单来说,就是对传入的对象没有所有权,当该对象引用计数为0时,即该对象被释放后,用weak声明的实例变量指向nil,即实例变量的值为0。
copy:与strong类似,但区别在于实例变量是对传入对象的副本拥有所有权,而非对象本身。

二、RunTime

1、RunTime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制。
2、对于C语言,函数的调用在编译的时候会决定调用哪个函数,编译完成之后直接顺序执行,无任何二义性。
3、OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)。
4、只有在真正运行的时候才会根据函数的名称找 到对应的函数来调用。

 * 动态的添加对象的成员变量和方法
 * 动态交换两个方法的实现
 * 拦截并替换方法
 * 在方法上增加额外功能
 * 实现NSCoding的自动归档和解档
 * 实现字典转模型的自动转换

这块太大了,可以参考:
Runtime简介及应用详解

三、RunLoop

RunLoop的作用
1、使程序一直运行并接受用户输入
2、决定程序在何时应该处理那些事件 (Event)
3、调用解耦 (Message Queue)---- 主调方 和 被调方,消息队列如何安排
4、节省CPU时间 ---- 没事的时候就闲着
RunLoop的 mode 类型
NSDefaultRunLoopMode :默认状态下,不滑动,空闲状态,程序启动之后就会被切到这个mode 
UITrackingRunLoopMode : 滑动的时候
UIInitializationRunLoopMode:私有的,可以追踪到的,这个app启动的时候是这个mode,第一个页面加载之后才回到第一个mode
NSRunLoopCommonModes:默认情况包括下第一个第二个,在这种情况下就是这两种情况都可以执行

详情可看
孙源@sunnyxx视频 RunLoop 介绍
YYKit 作者 深入理解RunLoop

四、NSThread、NSOperation、GCD

五、Block、Delegate、Notification

六、UDP、TCP、Socket、HTTP、POST、GET

一张图看出TCP和UDP的区别:

TCP与UDP区别.png
TCP连接的三次握手
 * 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
 * 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN+RECV状态;
 * 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次状态。
Scoket连接和HTTP连接的区别:

HTTP协议是基于TCP连接的,是应用层协议,主要解决如何包装数据。Socket是对TCP/IP协议的封装,Socket本身并不是协议,而是一个调用接口(API),通过Socket,我们才能使用TCP/IP协议。
HTTP连接:短连接,客户端向服务器发送一次请求,服务器响应后连接断开,节省资源。服务器不能主动给客户端响应(除非采用HTTP长连接技术),iPhone主要使用类NSURLConnection。
Socket连接:长连接,客户端跟服务器端直接使用Socket进行连接,没有规定连接后断开,因此客户端和服务器段保持连接通道,双方可以主动发送数据,一般多用于游戏.Socket默认连接超时时间是30秒,默认大小是8K(理解为一个数据包大小)。

GET和POST的区别
 * GET提交的数据会在地址栏显示出来,而POST提交,地址栏不会改变。
 * GET请求能够被缓存, POST请求不能被缓存下来。
 * GET请求会保存在浏览器的浏览记录中,POST请求不会保存在浏览器浏览记录中
 * GET提交时,传输数据就会受到URL长度限制,POST由于不是通过URL传值,理论上书不受限。
 * POST的安全性要比GET的安全性高;

HTTPS:安全超文本传输协议(Secure Hypertext Transfer Protocol),它是一个安全通信通道,基于HTTP开发,用于客户计算机和服务器之间交换信息,使用安全套结字层(SSI)进行信息交换,即HTTP的安全版。
详情可看
阮一峰的网络日志

七、简述内存分区情况

* 代码区:存放函数二进制代码
* 数据区:系统运行时申请内存并初始化,系统退出时由系统释放,存放全局变量、静态变量、常量
* 堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放
* 栈区:函数模块内申请,函数结束时由系统自动释放,存放局部变量、函数参数
ps: 栈和堆的不同
栈的空间由操作系统自动分配/释放,堆上的空间手动分配/释放。
栈空间是有限的,而堆是很大的自由存储区。

C中的malloc函数分配的内存空间是在堆上的,C++中对应的是new操作符。 
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上。
区分下面指针的不同
const char *p;
char const *p;
char * const p;
const char * const p;
* const char *p定义了一个指向不可变的字符串的字符指针,可以这么看:const char *为类型,p是变量。
* char const *p与上一个是一样的。
* char * const p定义了一个指向字符串的指针,该指针值不可改变,即不可改变指向。这么看:char *是类型,const是修饰变量p,也就是说p是一个常量
* const char * const p定义了一个指向不可变的字符串的字符指针,且该指针也不可改变指向。这一个就很容易看出来了。两个const分别修饰,因此都是不可变的。
面试中当然还会出现其他各式各样的问题,以上是我整理的,如有错误,欢迎指出。
上一篇 下一篇

猜你喜欢

热点阅读