iOS的面试合集 跳槽小秘籍(二)

更新有点慢,哈哈,谅解
加粗样式

#一套高级的面试题

『1.面试题无非就是笔者的一个积累,
2.面试过程中思考新题』

基础题 10

1 atomic的实现机制;为什么不能保证绝对的线程安全(最好可以结合场景来说)?

2 KVO的底层实现?如何取消系统默认的KVO并手动触发(给KVO的触发设定条件:改变的值符合某个条件时再触发KVO)?

3 class_ro_t 和 class_rw_t 的区别?

4 关联对象有什么应用,系统如何管理关联对象?其被释放的时候需要手动将所有的关联对象的指针置空么?

5 一个int变量被__block修饰与否的区别?

6 为什么在block外部使用__weak修饰的同时需要在内部使用__strong修饰?

7 RunLoop的作用是什么?它的内部工作机制了解么?(最好结合线程和内存管理来说)

8 分类和扩展有什么区别?可以分别用来做什么?分类有哪些局限性?分类的结构体里面有哪些成员?

9 Autoreleasepool所使用的数据结构是什么?AutoreleasePoolPage结构体了解么?

10 哪些场景可以触发离屏渲染?

SourceO(port)
1.通知Observer:即将进入Loop
2,通知Observer:将要处理Timer
3.通知Observer :将要处理SourceO
4.处理 SourceO
5,如果有Source’跳到第9步
6,通知Observer:线程即将休眠
Timer ► 7.休眠,等待唤醒
外部手动唤醒
8.通知Observer:线程刚被唤醒
9.处理唤醒时收到的消息,之后跳回2
10.通知Observer:即将退出Loop

Observer
-> Observer
_> Observer
-> SourceO
Sourcel
Observer
Observer
A Timer
Source1
Observer
■ ■

Runloop

第一次创建:启动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、getters setter如何生成并添加到这个类中的 本质:@property = ivar + getter + setter;(实例变量+getter方法+setter方法)
在编译期自动生成getter, setter,还自动向类中添加适当类型的实例变量,也可以用 ^synthesize语法来指定实例变量的名字

三 多线程

1、NSThread线程的生命周期:线程任务执行完毕之后被释放
-(void)c reateChildThreadl {
//I .创建线程
NSThread ^thread = [ [NSThread alloc] initWithTarget:self selector:@selector (run:) object:@“abc”];
//2 .启动线程

这里是引用

*[thread start];

  • (void)c reateChildThread2 {
    [NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@“分离子线程”];
    }
    -(void)c reateChildThread3 {
    [self performSelectorInBackground:@selector( run:) withObjects®"开启后台线程”]; }*

这里是引用

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。

atomic:原子属性,为setter方法加锁(默认就是atomic),线程安全,耗资源 nonatomic:非原子属性,不会为setter方法加锁,非线程安全

四 GCD 《队伍与队列
1 同步与异步区别
同步:只能在当前线程中执行任务,不能开启新线程 异步:可在新的线程中执行任务,能开启新线程
(2)队列
并发队列:可多个任务并发(同时)执行(会开启多个线程同时执行任务);只在异步函数 (dispatch_async)下有效
串行队列:一个任务执行完毕后,再执行下一个任务
主队列:主队列中的任务都在主线程中执行
#黑字主要记点

这些知识你掌握了吗? 请跟小编继续探索,今天文章就到者里了,需要更多面试题,请联系小编,点击我的腾讯文档【腾讯文档】更多资料分享
点击

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值