20171023-iOS开发-面试小计(一)

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:weakstrong的原理
自己写的 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修饰的对象

如有不对还请指导啊!!!!一块学习一块进步。

有些地方说的不到位,还请各位看官指正。。。

  • 欢迎各位一块学习,提高逼格!
  • 也可以添加洲洲哥的微信公众号

可以来微信公众号(洲洲哥)后台给我们留言。 快来扫码关注我们吧!

公众号二维码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值