您的位置:首页 > 职场人生

ios 部分面试题和答案

2014-05-19 09:35 357 查看
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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息