likes
comments
collection
share

iOSer面试刷一遍,高高兴兴面试快快乐乐回家。嘿!

作者站长头像
站长
· 阅读数 29

前言

学如逆水行舟,不进则退!!共勉!!

还在为面试不知如何回答而烦恼吗?还在为怀才不遇而烦恼吗?还在为不满意的工资却不敢跳槽而忿忿不平吗?今天让你这些烦恼通通都解决。不妨来看看这些面试题,不敢打包票,至少可以给你提供到帮助呢。优秀的人已经点赞和关注啦!!!不说废话了,给大家上面试题!!!

面试题

1.Runloop和线程关系

  1. 一 一对应,主线程的runloop已经创建,子线程的必须手动创建。

  2. 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,通常用不到

iOSer面试刷一遍,高高兴兴面试快快乐乐回家。嘿!

iOSer面试刷一遍,高高兴兴面试快快乐乐回家。嘿!

2.自动释放池什么时候释放?

  • //第一次创建:启动runloop时候
  • //最后一次销毁:runloop退出的时候
  • //其他时候的创建和销毁:当runloop即将睡眠时销毁之前的释放池,重新创建一个新的

3.什么情况下使用weak关键字,和assign的区别?

  1. ARC中,有可能出现循坏引用的地方使用,比如:delegate属性
  2. 自定义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修饰符?即让自己写的对象具备拷贝功能

具体步骤:

  1. 需要声明改类遵从NSCopying 或NSMutableCopying 协议
  2. 实现NSCopying协议。该协议只有一个方法:-(id)copyWithZone:(NSZone*)zone;

7.@property的本质是什么?ivar̵、getter̵、setter如何生成并添加到这个类中的?

本质:@property = ivar + getter + setter;(实例变量+getter方法+setter方法)

在编译期间自动生成getter、setter,还自动向类中添加适当类型的实例变量,也可以用@synthesize 语法来指定实例变量的名字

多线程

1. NSThread线程的生命周期:线程任务执行完毕之后被释放

iOSer面试刷一遍,高高兴兴面试快快乐乐回家。嘿!

2. 线程安全(加互斥锁):

  • 格式:@synchronized (self){//需要锁定的代码}
  • 注意:1.锁必须全局唯一;2.加锁的位置;3.加锁的前提条件;4.加锁结果:线程同步
  • 优点:防止多线程抢夺资源造成的数据安全问题
  • 缺点:耗费CPU性能
  • 使用前提:多线程使用同一块资源

线程同步:多条线程在同一条线上按顺序的执行任务

iOSer面试刷一遍,高高兴兴面试快快乐乐回家。嘿!

上图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)下有效
  • 串行队列:一个任务执行完毕后,在执行下一个任务
  • 主队列:主队列中的任务都在主线程中执行

iOSer面试刷一遍,高高兴兴面试快快乐乐回家。嘿!

iOSer面试刷一遍,高高兴兴面试快快乐乐回家。嘿!

主队列特点:如果主队列发现当前主线程有任务在执行,那么主队列会暂停调用队列中的任务,直到主线程空闲为止。

上图:方法-syncMain如果在主线程中调用,则会发生死锁,即102行之后的不会打印;如果在子线程中调用,则不会发生死锁,NSLog都能打印。

Runloop的应用:

  • NSTimer在子线程开启一个定时器;控制定时器在特定模式下执行
  • imageView的显示
  • performSelector
  • 常驻线程(让一个子线程不进人消亡状态,等待其他线程发来消息,处理其他事件)
  • 自动释放池

9.@protocol和category中如何使用@property?

  1. 在protocol中使用property只会生成setter和getter方法声明,使用属性的目的,是希望遵守该协议的对象能实现该属性
  2. category使用@property也是只会生成setter和getter方法声明,如果真的需要给category增加属性的实现,需要借助于运行时的两个函数: objc_setAssociatedObject

objc_getAssociatedObject

10.@property

  1. 原子性——nonatomic特质
  2. 读/写权限——readwrite(读写)、readonly(只读)
  3. 内存管理语义——assign、strong、weak、unsafe_unretained、copy
  4. 方法名——getter=、setter=

面试需要掌握的面试题

  1. weak属性需要再dealloc中设置nil么?
  2. @synthesize和@dynamic分别有什么作用?
  3. ARC下,不显示指定任何属性关键字,默认的关键字都有哪些?
  4. 用@propertys声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
  5. @synthesize合成实例变量的规则是什么?假如property名为foo,存在一个名为_foo的实例变量,那么还会自动合成新变量么?
  6. 再有了自动合成属性实例变量之后,@҅synthesize还有哪些使用场景?

还有很多经典中高级面试题的就不一一举例说明了,这几道题正好你们也可以考考自己,如果你需要更多的面试题来准备面试的话。就点击下方获取,备注来意.

经典高频面试题:获取地址

转载自:https://juejin.cn/post/7024019639130652679
评论
请登录