1:mrc
本质是什么?
一般都会说谁申请,谁负责释放。这句话没错。但是问的本质是什么? 这里先说说ARC
的本质:是编译器在编译的时候主动加了内存管理的代码,那么他是如何管理的尼?那这代码是怎么管理的? 是不是在全局
有一个hashmap
,把对应的变量和引用计数放进去,然后在过了引用域之后,会把引用计数自动归0
。 但是对象会被释放。
2:在block
执行之前,修改变量,在block里面获取的是变量什么时候的值?用weak
有什么用
毫无疑问的是,变量的最后一次赋值的数据。 首先block是分配到栈区的。必须先使用copy。 所以他的作用域就是在你创建的当前上下文,当你在该作用域外调用该block的时候,程序就会崩溃。 但是我们在使用block的时候不需要手动的去reain或者release。 也就是说在使用block的时候超出了作用域才需要copy。就是从栈区拷贝到堆区。着样搞完之后程序就不会奔溃。
3:在block
写多个[self dosomathing1]
,[self dosomathing2]
,[self dosomathing3],,,,
会有什么问题
这是一个尴尬的现象。为了避免就在block中先写一个strong self。 其实是为了避免在block执行过程中,突然出现self被释放的情况。 如果在持有self,但是不会产生循环引用的时候当你执行完block,如果没有其他对象持有的话,该block就是被释放掉, 从而bolck就不会持有self了。和uiview的动画的block一样
3:weak
和strong
的原理
自己写的 view 成员,应该用 weak 还是 strong?我个人觉得应该用 strong,因为用 weak 并没有什么特别的优势,加上上一篇面试题文章中,我们还看到,其实 weak 变量会有额外的系统维护开销的,如果你没有使用它的特别的理由,那么用 strong 的话应该更好。 另外有读者也提到,如果你要做 Lazy 加载,那么你也只能选择用 strong。 当然,如果你非要用 weak,其实也没什么问题,只需要注意在赋值前,先把这个对象用 addSubView 加到父 view 上,否则可能刚刚创建完,它就被释放了。 在我心目中,这才是我喜欢的面试题,没有标准答案,每种方案各有各的特点,面试者能够足够分清楚每种方案的优缺点,结合具体的场景做选择,
4:子线程是怎么回到主线程的?子线程为不能更新UI,同样都是自己的runloop
1:子线程回到主线程,是系统的线程调度问题。具体实现我不知道
2:有UIKit这样的框架一定要保证线程的安全。子线程不能更新UI,如果子线程和主线程都更新UI,那就可能会使程序崩溃。就是使对象释放两次了。即或不奔溃也会使UI错乱。也就是将UI操作方到主线程中去。因为在响应事件上就是更及时的,根本感觉不到变化。应为要更新UI都要等到子线程运行结束才执行。这时间很短,如果子线程一直在跑更新UI的函数,主线程是无法获取的,但然就没法更新。如果你搞一个按钮去点击去更换背景图片在等啊等的去换背景,如果还要看到他等待的这个时间的停顿,那这个响应就没必要了。
3:线程和runloop是一对一的
5:系统的内存分为几个区
1:栈区:存放局部变量,和函数参数
2:堆区:存放开辟内存的对象如:alloc,new。这里就是内存管理的地区
3:常量,静态区:存放consist和static修饰的对象
如有不对还请指导啊!!!!一块学习一块进步。
有些地方说的不到位,还请各位看官指正。。。
- 欢迎各位一块学习,提高逼格!
- 也可以添加洲洲哥的微信公众号
可以来微信公众号(洲洲哥)后台给我们留言。 快来扫码关注我们吧!