【潮汐】iOS面试题-ZHQBT(2019年6月)(1)
1、用dispatch_once_t onceToken实现Foo类的一个单例
static Foo * foo;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
foo = [[Foo alloc]init];
});
2、请使用一行代码移除contentView的所有subViews。
方法一(不符合题目要求):
iOS的 View 提供了一个 removeFromSuperview 的方法可以将 View 从父View上移除,如何删除 View 的所有子View,就可以通过 view.subviews 取到所有子View的数组,然后通过循环 removeFromSuperview 删除。
方法二(完美):
用数组的makeObjectsPerformSelector:SEL方法来减少自己写循环代码,让数组中的每个元素 都调用 removeFromSuperview方法。
//要删除当前contentView的所有子View下面一行代码即可搞定
[self. contentView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
3、请用一行代码判断一个类是否存在(如Foo类),并输出提示。
我们在开发的过程中难免会用到低版本中没有的类,如果我们想让我们的应用尽可能的兼容多个版本,我们需要考虑如果我们使用的类在低版本中没有怎么办呢。
Class pkClass = NSClassFromString(@"PKAddPassesViewController");
if (pkClass) {
NSLog(@"存在");
//如果可以使用,我们可以使用passkit的一些功能
}else{
NSLog(@"不存在");
//如果不可以,我们就要提示用户,或者进行一些其他的处理
}
4、SDWeblmage怎么处理图片的名称?
答案:对URL进行MD5加密
5、简述OC消息发送路径,如何避免出现unrecognized selector
消息发送的机制我们都明白,通过superclass指针逐级向上查找该消息所对应的方法实现。如果直到根类都没有找到这个方法的实现,运行时会通过补救机制,继续尝试查找方法的实现。那么我们能不能通过重写其中的某个方法,来达到不崩溃的目的?
思路:
创建一个接收未知消息的类,暂且称之为 Protector
创建一个 NSObject 的分类
在分类中重写** forwardingTargetForSelector: **,在这个方法中截获未实现的方法,转发给 Protector。并为 Protector 动态的添加未实现的方法,最后返回 Protector 的实例对象。
在分类中新增一个安全的方法实现,来作为 Protector 接收到的未知消息的实现。
点我查看详细参考
6、简述一下事件响应链的过程,并描述事件传递过程。
7、runtime是什么?例举下runtime在OC中的用途,不少于5种。
运行时(runtime)是指在程序运行时才确定数据的类型,调用指定的方法。将数据类型的确定由编译时推迟到了程序运行时。
runtime发送消息
交换方法
动态添加方法
给分类添加属性
字典转模型
获取属性列表
拦截调用