今天上午,下午分别面试了两家公司。上午是一家互联网公司,气氛还比较好,是我比较喜欢的。技术这块是直接机试,主要是给了些BUG让我修复,整个过程还算顺利。下午去了一家大型的证券公司。整理技术问题如下:

1. UIView的生命周期是什么样的,执行顺序是怎么样的?
init —— loadView —— viewDidLoad —— viewWillAppear —— viewWillDisappear —— viewDidUnload —— dealloc.

2. UIViewController在什么时候会加载UIView,换句话说,技术上在哪个时间点会执行loadView。
这个问题我没有答上来,原来写程序只知道是在addSubview或pushViewController的时候,程序就会执行loadView。于是觉得,loadView是在UIView要被显示出来之前执行的。后来了解到,这种说法其实有点本末倒至了。是因为执行了loadView,所以UIView才会被显示出来。正确的答案是,在view对象第一次被访问的时候,会执行loadView。

3. UITableView的执行流程是怎么样的?
省去UIView相关的不说,就UITableView来说,每个UITableView都会有一个delegate,delegate指向的对象会接受UITableView的委托从而实现一系列的方法。其主要的几个方法执行顺序如下:
numberOfSectionsInTableView——numberOfRowsInSection——titleForHeaderInSection——cellForRowAtIndexPath

4. UITableView是怎样实现Cell的重用的?
UITableView中有一个数组,visibleCells,保存可视的cell。假设一屏可以显示10个cell。当向上滑动tableView时,第1个cell移出可视范围,同时第11个cell显示出来。如果cell是通过dequeueReusableCellWithIdentifier方法得到的,其本质上,是将第一个cell放到第11个的位置,然后内容按照indexPath的要求重绘出来,但并不会清除cell中的subView。这也是为什么在cell中添加了UILabel后,上下拉动时,会有重影(多个UILabel重叠)。要避免此情况,Apple推荐自定义UITableViewCell。如果不自定义cell的话,可以为不同indexPath的cell定义不同的cellIdentifier。或是每次都通过遍历subview删除所有子视图,再重新addSubView,等等。

5. 如何设计一个可变高度(根据内容自适应高度)的UITableViewCell?
这个真是让人蛋疼,我原来确实没有遇到过这样的需求,做法都是定高,然后文字内容多了,直接省略,引导用户点击进入下一层观看。当时间歇性脑残的说了句不知道,后来想想,真的很简单:
我们在configureCell的时候,通过sizeWithFont方法获取UILabel的CGSize,从而得出自定义cell的高度,然后在heightForRowAtIndexPath里进行对应的赋值就可以了。-_-!!!

6. 谈谈内存管理机制。
这个大家基本都了解,Objective-C是通过retainCount来决定是否回收内存。每个NSObject都有一个计数器retainCount,当alloc时,retainCount的值为1,并且每次retain都会加1,release会减1,当retainCount为0的时候,内存会被释放。由此引发了另一个问题,NSString通过stringWithString创建的对象,他的作用域是什么呢?什么时候会被释放?我觉得,通过上述静态方法创建的对象约等于,[[[NSString alloc] initWithString:@”"] autorelease]; 也就是说,他是一个autorelease的对象,被放入NSAutoreleasePool中。系统会为每个RunLoop建立一个NSAutoreleasePool,当RunLoop结束时,autoreleasePool里的内存将被释放。
注:答题时我混淆了闭包和RunLoop的概念,把RunLoop说成了闭包。后面讲Block会谈到。

7. 谈谈对block的了解。
block才是闭包。闭包是一个函数或指向函数的指针,再加上其外部变量(也叫自由变量)。block有三种,NSConcreteGlobal, NSConcreteStack, NSConcreteMalloc。block是可以访问block外部的变量的。
NSConcreteGlobal: 就像一个全局函数一样,从头到尾待在那,始终是可用的。当Block中没有引用外部变量时,block为global类型的。
NSConcreteStack: 保存在栈中的block,block执行完后内存会被释放掉。当block引用了外部变量时,block为stack类型的。
NSConcreteMallock: 保存在堆中的block,block为引用记数为0时,内存会被释放掉。当block执行copy时,block会从栈中复制到堆中。
以上都针对非ARC环境而言,如果在ARC环境下,引用外部变量的block会自动保存在堆中,无需copy。

目前整理的就这么多,KVO,Delegate等设计模式今天没谈到。还有7个公司的面试等着哥呢,海量投简历的孩纸伤不起啊。我会持续更新。

最新文章

  1. LeetCode 5 Longest Palindromic Substring manacher算法,最长回文子序列,string.substr(start,len) 难度:2
  2. java.lang.NoClassDefFoundError: org/apache/ibatis/session/SqlSession
  3. mysql ERROR 1062: ALTER TABLE causes auto_increment resequen
  4. java-集合类
  5. 在打开vs解决方案时,怎样让所以打开的项目自动折叠
  6. file标签选择文件change事件失效处理方法
  7. AngularJS 服务(Service)
  8. Hibernate检索策略之延迟加载和立即加载
  9. Codeforces Round #134 (Div. 2)
  10. LNMP、LAMP、LANMP一键安装脚本(定期更新)[转]
  11. Continue
  12. 4月18开始看《C++Primer Plus》
  13. C#语言中的XmlSerializer类的XmlSerializer.Deserialize (Stream)方法举例详解
  14. 2 数据分析之Numpy模块(1)
  15. 集成Tomcat环境到Eclipse中
  16. 操作系统切换CPU的方式
  17. 数据库设计和ER模型-------之数据库系统生存期(第二章)
  18. 从入门到熟悉 HTTPS 的 9 个问题
  19. Python自动化开发 - 面向对象(一)
  20. cocos2d-x---CCLabelTTF加载字体库

热门文章

  1. sql之临时表
  2. 【网络爬虫】【java】微博爬虫(一):小试牛刀——网易微博爬虫(自定义关键字爬取微博数据)(附软件源码)
  3. CCF 201604-2 俄罗斯方块 (模拟)
  4. 通过HTTP请求WEBAPI的方式
  5. Flink on Yarn模式启动流程源代码分析
  6. beans.xml中的头部配置
  7. POJ3414(BFS+[手写队列])
  8. Bundle Adjustment光束平差法概述
  9. Type中的3个bool属性: IsGenericType , IsGenericTypeDefinition , IsGenericParameter
  10. [Xcode 实际操作]二、视图与手势-(4)给图像视图添加边框效果