iOSer面试刷一遍,高高兴兴面试快快乐乐回家。嘿!
前言
学如逆水行舟,不进则退!!共勉!!
还在为面试不知如何回答而烦恼吗?还在为怀才不遇而烦恼吗?还在为不满意的工资却不敢跳槽而忿忿不平吗?今天让你这些烦恼通通都解决。不妨来看看这些面试题,不敢打包票,至少可以给你提供到帮助呢。优秀的人已经点赞和关注啦!!!不说废话了,给大家上面试题!!!
面试题
1.Runloop和线程关系
-
一 一对应,主线程的runloop已经创建,子线程的必须手动创建。
-
runloop在第一次获取时创建,在线程结束时销毁 //在runloop中有多个运行模式,但是只能选择一种模式运行,mode中至少要有一个timer或者是source
Mode:
系统默认注册5个Mode:
kCFRunLoopDefaultMode:App默认mode,通常主线程在这个mode下运行
UITrackingRunLoopMode:界面跟踪mode,用于 ScrollView 追踪触摸滑动,保证滑动时不受其他mode影响
kCFRunLoopCommonModes:占位用的mode҅,不是一个真正的mode
NSRunLoopCommonModes 相当于NSDefaultRunLoopMode +UITrackingRunLoopMode
UIInitializationRunLoopMode:刚启动App时进入的第一个mode,启动完成之后不再使用
GSEventReceiveRunLoopMode:接受系统柜事件的内部mode,通常用不到
2.自动释放池什么时候释放?
- //第一次创建:启动runloop时候
- //最后一次销毁:runloop退出的时候
- //其他时候的创建和销毁:当runloop即将睡眠时销毁之前的释放池,重新创建一个新的
3.什么情况下使用weak关键字,和assign的区别?
- ARC中,有可能出现循坏引用的地方使用,比如:delegate属性
- 自定义IBOutlet控件属性一般也是使用weak
区别:weak表明一直非持有关系,必须使用OC对象;assign用于基本数据类型
4.怎么用copy关键字?
1̵. NSString̵、NSArray̵、NSDictionary等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString̵、NSMutableArray̵、NSMutableDictionary;他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。 2. block也使用copy
5.@property (copy) NSMutableArray *array;这写法会出什么问题?
1.添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃,因为copy就是复制一个不可变NSArray的对象; 2. 使用了atomic属性会严重影响性能;
6.如何让自己的类用copy修饰符?即让自己写的对象具备拷贝功能
具体步骤:
- 需要声明改类遵从NSCopying 或NSMutableCopying 协议
- 实现NSCopying协议。该协议只有一个方法:-(id)copyWithZone:(NSZone*)zone;
7.@property的本质是什么?ivar̵、getter̵、setter如何生成并添加到这个类中的?
本质:@property = ivar + getter + setter;(实例变量+getter方法+setter方法)
在编译期间自动生成getter、setter,还自动向类中添加适当类型的实例变量,也可以用@synthesize 语法来指定实例变量的名字
多线程
1. NSThread线程的生命周期:线程任务执行完毕之后被释放
2. 线程安全(加互斥锁):
- 格式:@synchronized (self){//需要锁定的代码}
- 注意:1.锁必须全局唯一;2.加锁的位置;3.加锁的前提条件;4.加锁结果:线程同步
- 优点:防止多线程抢夺资源造成的数据安全问题
- 缺点:耗费CPU性能
- 使用前提:多线程使用同一块资源
线程同步:多条线程在同一条线上按顺序的执行任务
上图3-2的理解:线程A(Thread A)和线程B(Thread B)同时访问资源变量Var,为了防止抢夺资源,Thread A在读取资源变量Var之前先加一把锁,然后读取Var的数据并在Thread A 中完成对数据的操作(17+1=18),然后把数据写入Var中,最后开锁unlock。在Thread A 对Var操作的过程中,Thread B是无权访问Var的,只有Thread A unlock之后,Thread B才能访问资源变量Var。
atmoic:原子属性,为setter方法加锁(默认就是atomic),线程安全,耗资源
nonatomic:非原子属性,不会为setter方法加锁,非线程安全
3. 线程间通信
<1>.NSThread实现
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait;
<2>.GCD实现
子线程和主线程相互切换
<3>.NSOperationQueue 实现
4. GCD(任务、队列)
<1>同步和异步的区别
- 同步:只能在当前线程中执行任务,不能开启新线程
- 异步:可在新的线程中执行任务,能开启新线程
<2> 队列
- 并发队列:可多个任务并发(同时)执行(会开启多个线程同时执行任务);只在异步函数(dispatch_async)下有效
- 串行队列:一个任务执行完毕后,在执行下一个任务
- 主队列:主队列中的任务都在主线程中执行
主队列特点:如果主队列发现当前主线程有任务在执行,那么主队列会暂停调用队列中的任务,直到主线程空闲为止。
上图:方法-syncMain如果在主线程中调用,则会发生死锁,即102行之后的不会打印;如果在子线程中调用,则不会发生死锁,NSLog都能打印。
Runloop的应用:
- NSTimer在子线程开启一个定时器;控制定时器在特定模式下执行
- imageView的显示
- performSelector
- 常驻线程(让一个子线程不进人消亡状态,等待其他线程发来消息,处理其他事件)
- 自动释放池
9.@protocol和category中如何使用@property?
- 在protocol中使用property只会生成setter和getter方法声明,使用属性的目的,是希望遵守该协议的对象能实现该属性
- category使用@property也是只会生成setter和getter方法声明,如果真的需要给category增加属性的实现,需要借助于运行时的两个函数: objc_setAssociatedObject
objc_getAssociatedObject
10.@property
- 原子性——nonatomic特质
- 读/写权限——readwrite(读写)、readonly(只读)
- 内存管理语义——assign、strong、weak、unsafe_unretained、copy
- 方法名——getter=、setter=
面试需要掌握的面试题
- weak属性需要再dealloc中设置nil么?
- @synthesize和@dynamic分别有什么作用?
- ARC下,不显示指定任何属性关键字,默认的关键字都有哪些?
- 用@propertys声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
- @synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?
- 再有了自动合成属性实例变量之后,@҅synthesize还有哪些使用场景?
还有很多经典中高级面试题的就不一一举例说明了,这几道题正好你们也可以考考自己,如果你需要更多的面试题来准备面试的话。就点击下方获取,备注来意.
经典高频面试题:获取地址
转载自:https://juejin.cn/post/7024019639130652679