1、synthesize和dynamic有什么作用?
- synthesize:
是系统自动生成getter和setter属性声明;@synthesize的意思是,除非开发人员已经做了,否则由编译器生成相应的代码,以满足属性声明; - dynamic:
是开发者自已提供相应的属性声明,@dynamic意思是由开发人员提供相应的代码:对于只读属性需要提供getter,对于读写属性需要提供 setter 和getter。
2、#define和const变量有什么区别?
define在预处理阶段进行简单的替换,const在编译阶段使用
define不做类型检查,仅仅展开替换,const有数据类型,会执行类型检查
define不分配内存,仅仅展开替换,const会分配内存
define不能调试,const可以调试
define定义的常量在替换后运行过程中会不断地占用内存,而const定义的常量存储在数据段,只有一份copy,效率更高
definde可以定义一些简单的函数,const不可以
3、请分别说明@public、@protected、@private的含义与作用?
- @public:对象的实例变量的作用域在任意地方都可以被访问 ;
- @protected:对象的实例变量作用域在本类和子类都可以被访问 ;
- @private:实例变量的作用域只能在本类(自身)中访问 .
4、为什么block属性要使用copy来修饰?
因为不用copy修饰的访问外部变量的block,只在他所在的函数被调用的那一瞬间可以使用。之后就消失了。
如果是堆中的block,也就是copy修饰的block。他的生命
周期就是随着对象的销毁而结束的。只要对象不销毁,我们就可以调用的到在堆中的block。所以使用copy修饰block目的是将block保存到堆里面。
5、属性可以拥有的特质可以分为四类:
- 原子性(atomic)、非原子性(nonatomic)
- 读写权限(readwrite、readonly)
- 内存管理语义(assgin,strong,weak,copy)
- 方法名getter=<name>、setter=<name>
6、属性的作用是什么?
主要的作用就在于封装对象中的数据。
7、属性的本质是什么?
属性的本质是实例变量与存取方法的结合。
@property = ivar + getter + setter
8、用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- 因为父类指针可以指向子类对象,使用 copy 的目的是为了让本对象的属性不受外界影响,使用 copy 无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.
- 如果我们使用是 strong ,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.
9、类别和类延展的区别?
category和extensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。
extensions可以认为是一个私有的Category。
10、如何让 Category 支持属性?
- category中不能添加属性,是因为可以声明属性,添加到该类的属性列表并声明getter和setter方法,但是并不会生成对应的成员变量,所以不能添加属性。UIView的分类是getter和setter方法调用了本类的其他属性。
- 如果要category支持属性,就只能使用运行时objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。
11、代理的作用是什么?
代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。
12、请谈谈堆和栈的区别
- 栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值, 局部变量的值等,栈是向低地址扩展的数据结构,是一块连续的内存的区域。即栈顶的地址和栈的最大容量是系统预先规定好的。
- 堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时由OS回收,向高地址扩展的数据结构,是不连续的内存区域,从而堆获得的空间比较灵活。
13、请你谈谈Objective-c的内存管理机制?
Objective-c中的对象都是基于引用计数来管理生命周期,简单的来说就是,我们需要持有一个对象时,调用retain让它的引用计数+1,不需要的这个对象的时候,调用release让它的引用计数-1。当一个对象的引用计数为0时,这个对象就会被自动销毁。
14、请你谈谈TCP的三次握手。
- 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;
- 第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包,即SYN+ACK包,此时服务器进入SYN+RECV状态;
- 第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次状态。
15、您一般是怎么用 Instruments 的?
- Time Profiler:性能分析
- Zombies:检查是否访问了僵尸对象,但是这个工具只能从上往下检查,不智能
- Allocations:用来检查内存,写算法的那批人也用这个来检查
- Leaks:检查内存,看是否有内存泄露
16、有哪些常见的crash场景?
- 访问了野指针
- 访问了僵尸对象
- 访问了不存在的方法
- 数组下标越界
- 在定时器下一次回调前将定时器提前释放
17、熟悉 CocoaPods 么?能大概讲一下工作原理么?
CocoaPods的原理是将所有的依赖库都放到另一个名为Pods的项目中,然后让主项目依赖Pods项目,这样,源码管理工作都从主项目移到了Pods项目中。Pods项目最终会编译成一个名为libPods.a的文件,主项目只需要依赖这个.a文件即可。
18、UIView和CALayer的区别和联系?
- 区别:
UIView和CALayer最大的区别是UIView可以接受并处理触摸事件,而CALayer不可以。 - 联系:
每个UIView内部都有一个CALayer在背后提供内容的绘制和显示,并且UIView的尺寸样式都由内部的CALayer所提供。
19、遇到tableView卡顿嘛?会造成卡顿的原因大致有哪些?
- 最常用的就是cell的重用, 注册重用标识符
- 避免cell的重新布局
- 提前计算并缓存cell的属性及内容
- 减少cell中控件的数量
- 不要使用ClearColor,无背景色,透明度也不要设置为0,因为渲染耗时比较长
- 使用局部更新
- 加载网络数据,下载图片,使用异步加载,并缓存
- 缓存行高
- 少使用addView 给cell动态添加view
20、控制器的生命周期?
- loadView: 加载view
- viewDidLoad: view加载完毕
- viewWillAppear: 控制器的view将要显示
- viewWillLayoutSubviews: 控制器的view将要布局子控件
- viewDidLayoutSubviews: 控制器的view布局子控件完成
- viewDidAppear: 控制器的view完全显示
- viewWillDisAppear: 控制器的view即将消失
- viewDidDisAppear: 控制器的view完全消失
21、进程和线程的区别?
进程和线程的主要差别在于它们是不同的系统资源管理方式。进程独有的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程不能用进程。
22、进程的持有实体分为那几个?
- CPU
- 内存
- 堆区
- 栈区
- 全局区
- 常量区
- 代码区
23、事件响应的原理?
- 一个UIView发出一个事件之后,首先上传给其父视图、
- 父视图上传给其所在的控制器
- 如果其控制器对事件进行处理,事件传递将终止,否则继续上传父视图
- 直到遇到响应者才会停止,否则事件将一直上传,直到UIWindow
24、自动释放池的工作原理?
自动释放池是NSAutorelease类的一个实例,当向一个对象发送autorelease消息时,该对象会自动入池,待池销毁时,将会向池中所有对象发送一条release消息,释放对象,[pool release]、[pool drain]表示的是池本身不会销毁,而是池子中的临时对象都被发送release,从而将对象销毁。
24、KVO的实现原理?
- KVO是基于runtime机制实现的
- 当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。派生类在被重写的setter方法实现真正的通知机制
25、http请求中包括那些?
- http请求是客户端往服务端发送请求动作,告知服务器自己的要求。
- http请求由状态行、请求头、请求正文三部分组成:
- 状态行:包括请求方式Method、资源路径URL、协议版本Version;
- 请求头:包括一些访问的域名、用户代理、Cookie等信息;
- 请求正文:就是HTTP请求的数据。
- 备注:请求方式Method一般有GET、POST、PUT、DELETE,含义分别是获取、修改、上传、删除,其中GET方式仅仅为获取服务器资源,方式较为简单,因此在请求方式为GET的HTTP请求数据中,请求正文部分可以省略,直接将想要获取的资源添加到URL中。