iOS 面试题

182 阅读3分钟

iOS 面试题

iOS framework 介绍 property 属性 runtime 原理,有什么作用 category extension 区别 分类 添加set ,get 方法就可以了 objc_setAssociatedObject objc_getAssociatedObject 扩展 扩展只能声明方法、属性,具体实现需要在源文件中实现 用过的多线程有哪些? gcd nsthread pthread 区别 runloop 原理,有什么作用 线程同步 如何实现 信号量 是什么? 介绍常用的锁:乐关锁,自旋锁,互斥锁 介绍一下常用的开发模式:观察者模式,代理模式,适配器模式,工厂模式... new alloc init 有什么区别 new 直接初始化内存并调用隐式的init方法 alloc init 会把内存分配在关联对象的zone中,减少调用消耗,可以自定义init方法 可变和不可变对象的区别? 分别用什么修饰? 用copy类型会强制将NSMutableArray转换为NSArray类型,所以无法使用NSMutableArray的remove等等方法,导致crash nsstring copy浅拷贝 mucopy深拷贝 nsmutablestring 都是深拷贝 copyitems 深拷贝 如果仍然是map还是浅拷贝 自定义copy 1.让类实现NSCopying/NSMutableCopying协议。 2.让类实现copyWithZone:/mutableCopyWithZone:方法

Load是在runtime加载类,分类的时候调用的 Initalize是在类第一次接收到消息的时候调用的,

assign修饰基本数据类型或结构体,因为基本数据类型是分配在栈上的,由系统分配和释放,所以不会造成野指针。 对象的内存一般被分配到堆上,基本数据类型和结构体一般被分配在栈上。 assign用于基本数据类型和结构体。如果修饰对象的话,当销毁时,属性值不会自动置nil,可能造成野指针。

iOS使用atomic不一定是线程安全的 如果是数组中的数据就无法保护

kvo/kvc runtime 知识

start->(加载framework,动态静态链接库,启动图片,Info.plist等)->main函数->UIApplicationMain函数:

view: 1、通过作为CALayer的代理,管理layer的渲染(顺序大概是先更新约束,再layout再display)和动画(默认layer的属性可动画,view默认禁止,在UIView的block分类方法里才打开动画)。layer是RGBA纹理,通过和mask位图(含alpha属性)关联将合成后的layer纹理填充在像素点内,GPU每1/60秒将计算出的纹理display在像素点中。 2、布局子控件(屏幕旋转或者子视图布局变动时,view会重新布局)。 3、事件响应:event和guesture。

runloop: 1、(要让马儿跑)通过do-while死循环让程序持续运行:接收用户输入,调度处理事件时间。 2、(要让马儿少吃草)通过mach_msg()让runloop没事时进入trap状态,节省CPU资源。

所以UIView的动画block不会造成循环引用的原因就是,这是个类方法,当前控制器不可能强引用一个类,所以循环无法形成。