问题:
1.如何实现多代理回调,并且多个代理的方法都要执行?
创建中间桥接类(代理的容器类),桥接类定义单独的代理对象属性 vc提供adddelegate的方法以及存储桥接类的数组,回调的时候遍历存储桥接类的数组,依次执行协议方法。
2.事件分发原理,手势传递过程
只有继承与uiresponder的对象能够响应事件touch对应的api,事件产生后被加到uiapplication管理的事件队列中,由它来由里往外递,window-view-subview,递归传递(找到view之后调用hittest:查找view的子view),找到最合适的view(响应链第一响应者)后调用touches方法对事件进行响应,如果没有重写将事件沿着响应者链往上抛(由外往里抛一直到uiapplication,与事件传递相反),手势识别器会延迟事件向所绑定的视图传递,优先去识别手势处理touch事件
3.sd图片存储过期时间在什么时机设置?(有效时间设置)
下载结束实例化webimage的时,sdimagecache中有变量表示图片缓存的最大值和过期时间
4.kvo能监听数组么?
可以监听可变数组的长度变化,但是不能监听到数组里面某一个对象的变化,不能使用array addobject的方式添加,要使用array [mutableArrayValueForKeyPath:@“dataArray”]
5.gcd的源码理解
注意常用的几个api,汇总group,顺序执行barrir
6.masonry如何使用链式语法对autolayout进行封装的?
make.centerX.mas……()点语法实现,通过属性的方式实现多级的调用,调用的方法是对象的block属性。将block作为属性进行访问、block的返回参数是自定义对象
7.如何自己实现cell高度缓存,autolayout使用系统计算高度有什么问题?
tableview设置了UITableViewAutomaticDimension之后autolayout会自动计算cell的高度但是不会缓存这个高度值,在cellforrowatindexpath中计算高度做缓存。cellforrow与heightforrow的调用顺序:设置了预估高度前者在前、否则后者在前会轮训一遍计算contentsize
8.tableview优化,设置透明度是怎么影响gpu性能的?
tableview的cell复用,缓存cell的高度不用每次都要计算,计算的时候放在异步线程中,图片异步加载,缓存资源,懒加载,布局的时候不要太多层级,不要动态的添加subview提前添加完毕然后控制显影 因为每次添加之后会重新布局autolay消耗性能,减少绘图操作;预渲染图像,不要使用透明背景会导致混合操作(gpu负责),这个过程很耗时
9.iOS9之前tableview的代理为啥用assign?
之前的delegate需要在dealloc中对代理设置为nil,
assign修饰delegate不对引用计数操作,使用之后没有设置为nil可能会产生野指针,而weak会自动设置为nil。
10.runtime使用场景有哪些?
方法交换,获取属性列表方法列表,动态创建类创建属性。。。
11.jsonmodel实现细节
12.如何避免外界通过kvc访问成员变量?
将accessInstanceVariablesDirectlygetter方法返回NO,
kvc本质上是操作方法列表以及在内存中查找实例变量,可以利用此特性访问类的私有变量。
14.coretext,coreimage如何使用
15.gcd如何去取消一个正在执行的请求任务
ios8之后可以调用dispatch_block_cancel来取消还没有执行的任务
模拟NSOperationQueue定义外部变量,用来标记block是否需要取消,即外部变量为NO时,可以在block里面返回(感觉这个操作没什么意义)
16.NSOperationQueue 添加的任务默认是怎么执行,同步还是异步
可设置优先级(operation设置完依赖之后再比较优先级),并发数量
NSOperation默认是同步执行,将operation添加到队列中是异步执行的,给operation添加依赖 addDependency,即在其他operation执行完之后在执行
17.[obj someMethod],oc方法调用的原理是什么?
oc中方法调用最终转换成runtime的c语言函数objc_msgSend(id receiver,SEL op,),信息发送后会在receiver类对象的方法列表中找这个方法。
首先去该类的cache中查询,找到返回;没找到就去methodlist中查找,找到就将方法的IMP返回并将IMP存入cache中;如果还没有找到,通过super_calss找到父类,在父类的methodlist中查找;如果父类中没有找到进行动态决议和消息转发;如果动态决议和消息转发返回NO和nil,就抛出异常
18.NSOperationQueue 中的串行指的是最大并发数为1,默认是-1即并行
19.NSOperationQueue中执行完A,B 再去执行C任务如何实现
可以对任务设置依赖
20.静默推送
iOS7之后在后台任务增加了特性:后台获取、推送唤醒、后台传输。
需求:在应用退到后台时某一个时间点唤醒设备更新UI,在用户下次点击应用图标进入应用的时候就能看到已经更新好的UI了。
后台的格式:增加content-available字段并设成1;alert字段必须为空否则收到的就不是静默推送;sound字段不影响静默推送,看需求是否需要。
总结:相当于应用在后台的时候app中收到推送回调,在没有打开app的前提下去做一些操作,例如刷新UI等,Xcode中需要设置remote notifications
21.用c创建的对象arc下需要自己去释放吗?
用free()去释放
22.udp服务器如何发送消息,是否是面向连接
23.项目中遇到哪些难题,上架是否遇到过问题?
项目难题:
上架问题:启动图片含有苹果的logo直接被打回;
上架勾选了内购但是没有开发内购功能;符合内购的功能模块确使用了第三方支付;
24.混合开发时,客户端的登录状态如何同步到h5页面?
可以通过webjsbridge约定一个方法,在app登录成功的时候通知h5去登录
app中的登录信息其实就是一个token值,可以将token或者用户id传递给h5.
传递之前清理一下h5的地址对应的cookie(遍历cookie单例找到改url对应cookie并删除);
加载html的时候讲token通过cookie传递过去(在包装request的时候设置进去);
25.weak的原理是什么,知道多少说多少?
weak是Runtime维护了一个hash(哈希)表,用于存储指向某个对象的所有weak指针。weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象指针的地址)数组。
26.wk与webview区别?
wkwebview有更多的h5特性,更高的滚动刷新率内置手势
27.autolayout布局的view,如何在自己.m文件中获取宽高以便子视图根据条件布局?
可以在layoutsubviews里面获取
28.xr的适配 设备唯一标示怎么获取 不用uidevice 苹果貌似禁止了?
注意安全区safeArea,设备尺寸宏定义。[NSUUID UUID].UUIDString动态id,每次生成的id都不一样,udid/Mac地址/openudid 都被苹果禁止了,苹果不允许访问用户唯一的隐私数据。
29.表情是怎么实现的,本地存储?还有表情是如何展示的(图文混排怎么做)?
本地需要两个字典,表情图片字典、表情含义字典。图文混排使用yykit
30.cache目录下文件如何缓存的 跟tmp目录下的文件有什么区别?
用户生成的文件、其他数据及其他程序不能重新创建的文件,应该保存在/Documents目录下面,并将通过iCloud自动备份,可以重新下载或者重新生成的数据保存在/Library /caches目录下面,不备份。
tmp下的文件系统会根据情况将其清空 可能是内存不足的时候也可能是其他时候
31.ios怎么去管理一个线程的生命周期?
可以监控线程查看runloop处于什么mode
32.如何解决内存暴涨问题?
创建对象的时候控制一次性创建的数量,创建完成回收该内存空间
33.fmdb如何解决多线程问题?
使用FMDatabaseQueue 思路是:创建一个队列,然后将放入队列的block顺序执行,这样避免了多线程同时访问数据库;每个线程使用同一个Queue实例