背景是昨天看到群里有人发面试题,然后一群人就在那里讨论,看完之后我觉得这几道题写的挺好的,所以这里简单的来解释下,首先答案是:对,错,对,错(这个结果应该是对的,不确定的可以自行去查看资料)
1.串行队列Serial Dispatch Queue中的block都在同一个线程里执行,因为这是一个串行队列,串行队列是一个block,队列中有排队执行的任务,每个人物又是一个block,任务对应的block都在队列这个大的block中执行,所以他们都是在同一个block中执行的是正确的。
2.NSArray默认是浅拷贝,默认为copy,是浅拷贝,mutableCopy是深拷贝,这个copy当时群里讨论了许久,使用了copy会对使用对象进行copy,拷贝的是指针,而不是内存地址,copy了就会创建一个新的对象,它和原来的被拷贝对象指针不同,内存地址是一样的,当对拷贝后的对象字符串或者原来的对象字符串进行直接赋值,比如str=@“Hello”;内存地址会改变,指针不变。如果是对copy后的对象进行赋值,原对象地址不变,新的对象会重新分配一块新的内存地址,指针不变。对mutableCopy而言,因为是深拷贝,所以内存地址直接改变,指针也改变。
3对nil对象发送消息是有默认返回值的,返回值根据发送消息的类型而不一样,为0,为NO,或者为空的结构体,也有可能会返回nil的消息,但是一定会有消息返回,在cocoa中的几种模式中有专门应用。
4.KVO回调都是在主线程这句话没错,错在他们是同步执行的,程序中我们用到KVO的地方有很多,然而执行的速度是很快的,并没有发生排队执行的情况,所以说明它的回调是异步执行的,否则主线程必定会出现被卡住的情况,而在实际应用中,是没有的。仔细想想也不可能是同步执行的,用到KVO的地方太多,都排着队执行,程序执行肯定会存在延时。
以上是博主的个人见解和群里人讨论后的一些见解,细节地方,感兴趣的朋友可以自己去详细分析。