iOS面试题 第一天
今天上午,下午分别面试了两家公司。上午是一家互联网公司,气氛还比较好,是我比较喜欢的。技术这块是直接机试,主要是给了些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个公司的面试等着哥呢,海量投简历的孩纸伤不起啊。我会持续更新。
iOS面试题 第一天的更多相关文章
- [转载]iOS面试题总
转载自:http://blog.sina.com.cn/s/blog_67eb608b0101r6xb.html (2014-06-13 20:23:33) 转载▼ 标签: 转载 crash 原文 ...
- iOS面试题大全-点亮你iOS技能树
所有的内容大部分来自于网络的搜集,所以我不是一个创造者,而是一个搬运工.我尽量把题目,尤其是参考答案的出处列明.若有任何疑问,建议,意见,请联系我. 第一部分面试题来源于iOS-Developer-I ...
- ios 面试题 经典(比较全) 根据重点总结
史上最全的iOS面试题及答案 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encodin ...
- YouKu iOS笔试题一
序言 最近收到某某同学将去youku的iOS笔试题的邮件,希望笔者能整理一下,并提供参考答案.笔者决定整理出来,并分享给大家.当然,与此同时,也想看看youku的笔试题到底有多难,也考考自己有多少料吧 ...
- ios面试题1
iOS面试题 1.写一个NSString类的实现 + (id)initWithCString:(c*****t char *)nullTerminatedCString encoding:(NSS ...
- iOS面试题整理带答案
iOS面试题整理带答案 找工作,面试是避免不了的! 而技术开发面试,问一些技术相关的问题是必须的,最新的技术可能人人都趋之若鹜,但有些原理和基础的也希望都有了解. 这里整理了一些iOS相关 ...
- 大厂常问iOS面试题--多线程篇
1.进程与线程 进程: 1.进程是一个具有一定独立功能的程序关于某次数据集合的一次运行活动,它是操作系统分配资源的基本单元. 2.进程是指在系统中正在运行的一个应用程序,就是一段程序的执行过程,我们可 ...
- 最全的iOS面试题及答案-转载
1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承:可以实现多个接口,通过实现 ...
- IOS面试题总结
iOS面试题: 一:网络理论知识的理解 1:Internet物理地址和IP地址转换采用什么协议 ARP(Address Resolution Protocol)地址解析协议 2:Internet采用哪 ...
随机推荐
- 3-C++程序的结构1.4
共享数据的保护 对于既需要共享.又需要防止改变的数据应该声明为常量. 1.常引用 如果在声明引用时用const修饰,被声明的引用就是常引用.常引用所引用的对象不能被更新.声明形式如下: const 类 ...
- Linux系统调用及其效率
操作系统相关概念: 操作系统---管理计算机硬件与软件资源的软件,是用户与系统操作交互的接口,为在它上面运行的程序提供服务. 操作系统内核 ----操作系统的核心.负责管理系统的进程.内核.设备驱动程 ...
- CodeForces 665B 【水-暴力】
题意(来自网络): 现在有k件商品,每个商品的位置已经告诉你了 现在有n个人,每个人有m个需求,每个需求就是要把第a[i][j]个物品拿到第一个位置来 他的代价是pos[a[i][j]] 问你所有代价 ...
- perl C/C++ 扩展(四)
在前面三篇博客中,我们了解到如何使用c/c++ 扩展自己的perl 库,但是博主在学习过程中,对动态库或静态库的加载不是十分了解,后来自己又细挖一下.后来就有了这篇博文,再后来,没有再后来了,囧!! ...
- bzoj5148:[BeiJing2018]Kakuro
传送门 有上下界最小费用可行流,行列建边变形. 行列建边相信大家都做过,没做过的可以看一下这个题:bzoj3698XWW的难题,对应的我写的题解题解 这个题需要变形一下,不只是单纯的对行列进行连边,首 ...
- c# JsonReader读取json字符串
使用JsonReader读Json字符串: string jsonText = @"{""input"" : ""val ...
- bryce1010专题训练——LCA
1.Targan算法(离线) http://poj.org/problem?id=1470 /*伪代码 Tarjan(u)//marge和find为并查集合并函数和查找函数 { for each(u, ...
- 洛谷 P1053 篝火晚会
https://www.luogu.org/problemnew/show/P1053 错误记录:判-1的时候出了些问题(比如只判了图是否连通):数组没清空 #include<cstdio> ...
- 如何实现序列化为json
因为需要观察对象的数据,所以寻找能自动描述对象中字段名和其值的描述类,咨询了不少人,都推荐使用json,但是json使用起来有一点额外的操作. 需要在文件中引用 using System.Web.Sc ...
- python __new__ __init__ 区别
参数 __new__的第一个占位参数是class对象 __init__的第一个占位参数是class的实例对象 其他的参数应一致 作用 __new__ 用来创建实例,在返回的实例上执行__init__, ...