UI常见面试题:
1、UIViewController 生命周期
答:(1)视图控制器的装载:当视图控制器从 nib 文件而来时,nid 中创建一个视图,然后调用 viewDidLoad 方法,不会调用 loadView 方法。当没有创建 nib文件,创建一个视图控制器时,视图控制器调用会调用 loadView 方法创建一个空的视图,当你覆盖 loadView 方法时,需要创建一个视图给视图控制器,或者调用父类的 loadView 方法,完成视图的创建后,再调用 viewDidLoad 方法。之后调用 viewWillAppear:方法和 viewDidAppear 方法表示视图已全部渲染完成。
(2)视图控制器的卸载:当设备内存不足时,调用didRecieveMemoryWarning,如果当前的视图控制器可以被安全的释放,那么将调用 viewWillUnload:方法和 viewDidUnload 方法,我们在这两个方法中将视图所拥有的强引用对象释放。当在 iOS6 中不在调用这个两个方法而是只调用didRecieveMemoryWarning,那么我们就在这个方法中将当前视图控制器中的视图所拥有的对象销毁。
2、什么是响应事件者链
答:当 Application Kit 在应用程序中构造对象时,会为每个窗口建立响应者链。响应者链中的基本对象是 UIWindow 对象及其视图层次。在视图层次中级别较低的视图将比级别更高的视图优先获得处理事件或动作消息的机会。NSWindow中保有一个第一响应者的引用,它通常是当前窗口中处于选择状态的视图,窗口通常把响应消息的机会首先给它。对于事件消息,响应者链通常以发生事件的窗
口对应的 NSWindow 对象作为结束,虽然其它对象也可以作为下一个响应者被加入到 NSWindow 对象的后面。
3、简述 tableView 的重用机制
答:表视图的重用机制是一种节约设备内存的机制,尤其是需要显示大量数据时,显得尤其重要。当我们开始创建表视图的一行时,首先定义一个静态的字符串作为单元格的标识符,然后通过该标识符去检测该表视图中有没有闲置的单元格,如果没有,我们就创建一个新的单元格,并且给它指定一个标识符。如果已有闲置的单元格,则直接从表视图中取出来,给单元重新赋上新的值。初学者容易犯的错误时,当我需要自定义一个单元格时,将自定义实例创建在“括号”外,这样单元格中会出现重叠现象,这是初学者常见的错误。此外,如果当前表视图显示 10 个单元格,那么 11 个就可以满足重用的需要。
4、代理、通知和 KVO 的区别以及它们的优缺点
答:代理是一种回调机制,且是一对一的关系,而通知是一对多的关系,一个中心对象向所有的观察者提供变更通知(KVO 是被观察者向观察者直接发送通知,这是通知和 KVO 的区别)。http://blog.csdn.net/dqjyong/article/details/7685933http://www.apple.com.cn/developer/mac/library/documentation/Cocoa/Conceptual/CocoaFundamentals/CommunicatingWithObjects/chapter_6_section_7.html
5、如何适配 iOS6
答:iPhone5 的分辨率是 1136x640, 尺寸是 568x320,适配 iphone5 的屏幕首先要添加 Default-568h@2x.png 作为启动图片,否则上下会有黑边出现。
用宏定义获取设备的尺寸,减少程序中的硬编码。
#define iPhone5 ([UIScreeninstancesRespondToSelector:@selector(currentMode)] ?
CGSizeEqualToSize(CGSizeMake(640, 1136), [[UIScreenmainScreen] currentMode].size) : NO)
6、线程和进程的区别
答:线程是进程的一部分,进程是程序的一部分。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,主线程死掉就等于整个进程死掉。所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
7、什么是 MVC,如何理解
答:M 表示 model,即数据模型,V 表示 view,即视图,C 表示 viewController,即视图控制器,使用 MVC 的目的是将 M 和 V 的实现代码分离,从而使同一个程序可以使用不同的表现形式。C 存在的目的则是确保 M 和 V 的同步。
8、bounds 和 frame 的联系与区别答:如下图所示:
9、如何发起一个 http 同步、异步网络请求答:(1)同步请求
// 构造 url
NSURL *url = [NSURL URLWithString:@"http://www.taobao.com"];// 创建一个请求对象
NSURLRequest *request = [NSURLRequest requestWithURL:url];NSURLResponse *response;
// 发送同步请求,请求成功后返回数据
NSData *resultData = [NSURLConnection
sendSynchronousRequest:request
returningResponse:&responseNSString *datastring = [[NSString alloc] initWithData:resultData
encoding:NSUTF8StringEncoding];self.resultText.text = datastring;
error:nil];
(2)异步请求
NSURL *url = [NSURL URLWithString:request_url];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
// 发送异步请求
[NSURLConnection connectionWithRequest:request
delegate:self];
// 接受加载的数据
- (void)connection:(NSURLConnection
didReceiveData:(NSData *)data {[_data appendData:data];
}
// 数据加载完以后调用
*)connection
- (void)connectionDidFinishLoading:(NSURLConnection*)connection {
NSString *datastring = [[NSString alloc] initWithData:_data
encoding:NSUTF8StringEncoding];self.resultText.text = datastring;
}
大家详见课件。
10、多线程的基本概念,在 cocoa 实现多线程提供了那些解决方案
答:NSThread、block 语句等等详细见课件。11、NSRunloop 的基本概念
答:Run loops 是线程相关的的基础框架的一部分。一个 run loop 就是一个
事件处理的循环,用来不停的调度工作以及处理输入事件。使用 run loop 的目的是让你的线程在有工作的时候忙于工作,而没工作的时候处于休眠状态。
12、网络数据传输一般有几种格式,他们有哪些区别,你又用的哪些框架进行解析的
答:JSON、XML;
JSON:JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。
1、对象是一个无序的“‘名称/值’对”集合。一个对象以“{”开始,以“}”结束。每个“名称”后跟一个“:”,“‘名称/值’对”之间使用“,”分隔。
2、数组是值(value)的有序集合。一个数组以“[”开始,“]”结束。值之间使用“,”分隔。
XML:可扩展标记语言(extensible Markup Language,简称:XML),是一种标记语言。XML 设计用来传送及携带数据信息,不用来表现或展示数据,HTML语言则用来表现数据,此外,XML 天生有很好的扩展性,JSON 当然也有。不过JSON 在 Javascript 主场作战,可以存储 Javascript 复合对象,有着 xml 不可比拟的优势。
13、Dom 和 Sax 解析的优缺点
答:DOM即Document Object Model,中文叫文档对象模型。
SAX即Simple API for XML的简称,中文叫XML简单应用程序接口。
Dom 解析(常见框架是 GDataXMLNode)的优点是解析 XML 变得简单,但是
耗费内存资源,因为它是一次性将 XML 转换成 Dom 对象。Sax 解析 XML 较为复杂,但是解析的速度快、而且占用内存较小(NSXMLParser)。
14、CALayer 的基本概念,它与 UIView 又是什么关系
答:通常会将 UIView 理解为能够在屏幕上直接制图的对象,实际上从技术的角度而言,视图自身并不在窗口上绘图,它只知道如何在 CALayer 对象上绘图。我们在创建一个 UIView 实例时,该对象会自动创建一个层(自己创建的这个层称为隐式层)。视图在绘图时,将内容画在自己的层上。当视图在层上完成绘图后,系统会将层拷贝到屏幕上。如果我们创建一个 CALayer 层的实例,我们称之为显示层,层其实就是一副位图。(层的委托对象是 UIView)
15、cocoa touch 框架
iPhone OS 应用程序的基础 Cocoa Touch 框架重用了许多 Mac 系统的成熟模式,但是它更多地专注于触摸的接口和优化。
UIKit 为您提供了在 iPhone OS 上实现图形,事件驱动程序的基本工具,其建立在和 Mac OS X 中一样的 Foundation 框架上,包括文件处理,网络,字符串操作等。
Cocoa Touch 具有和 iPhone 用户接口一致的特殊设计。有了 UIKit,您可以使用 iPhone OS 上的独特的图形接口控件,按钮,以及全屏视图的功能,您还可以使用加速仪和多点触摸手势来控制您的应用。
各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了创建世界一流 iPhone 应用程序需要的所有框架,从三维图形,到专业音效,
甚至提供设备访问 API 以控制摄像头,或通过 GPS 获知当前位置。
Cocoa Touch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C框架,也在需要时提供基础的 C 语言 API 来直接访问系统。这些框架包括:
Core Animation:通过 Core Animation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
Core Audio:Core Audio 是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能。
Core Data:提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用或大或小的数据模型。
功能列表:框架分类
下面是 Cocoa Touch 中一小部分可用的框架:
音频和视频:Core Audio ,OpenAL ,Media Library ,AV Foundation数据管理 :Core Data ,SQLite
图形和动画 :Core Animation ,OpenGL ES ,Quartz 2D网络:Bonjour ,WebKit ,BSD Sockets
用户应用:Address Book ,Core Location ,Map Kit ,Store Kit
16、将变量保存到本地,列举两个简单的方法
答:使用 writeToFile 方法,将字符串、字典、数组直接保存。将对象保存到
本地,需要实现 NSCoding 协议。17、简述真机调试的基本流程
答:参考真机调试流程一文
18、远程推送通知的基本流程答:参看远程推送通知一文
19、如何发布我们的应用程序
答:参考真机调试的流程,将程序打包成一个发布的包,最后使用使用application Loader、或者用 xCode 直接发布。
可参考:http://mobile.51cto.com/iphone-280746.htm
20、 setNeedsLayout、 setNeedsDisplay
答:调用 setNeedsLayout 方法将会调用 UIView 的 layoutSubview,会对视图重新排版;调用 setNeedsDisplay 方法将会调用 UIView 的 drawRect 方法,会对视图重新绘制。(它们都是异步执行的)
21、以下函数主要完成什么事情?
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))
答:这个函数被调用的主入口点创建应用程序的对象和应用程序委托和事件循环。注意这个函数虽有返回值,但这个函数在程序没有结束时,永远不会返回。
22、用过什么内存优化管理工具答:instruments
23、iOS 后台可以运行哪些类型的程序,如何自定义一个后台运行的任务
答:audio(音频播放)、location(位置服务)、voip(网络电话),在 plist 文件中 Required backgroud modes 属性中添加需要在后台执行的任务。
一般自定义的后台任务只能执行 600s。如果需要自定义一个后台任务超过
600s,见以下代码,详见课件。if (__count % 500 == 0) {
UIApplication*application = [UIApplication sharedApplication];bgTask=[application
beginBackgroundTaskWithExpirationHandler:^(void){
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid;}];
}
24、iPhone4 代和 ipad3 之后,我们在添加图片时,需要注意些什么
答:一般情况下为需要为 iPhone(4 以上)、ipad(3 以上)准备 2 张图片,一张原图,一张 retina 图(双倍、按像素),假设原图为 image.png,高清图我们命名为 image@2x.png。
iPad 图片:
大小(像素) |
文件名 | 用途 | 重要度 |
512*512 |
—— |
iTunes 展示图片 |
推荐有 |
1024*1024 |
—— | iTunes 展示图片 | 推荐有 |
72*72 |
Icon-72.png | App store\home | 必须有 |
144*144 |
Icon-72@2x.png |
App store\home |
推荐有 |
50*50 |
Icon-Small-50.png | Setting、Spotlight | 推荐有 |
100*100 |
Icon-Small-50@2x.png |
Setting、Spotlight |
推荐有 |
768*1004 |
Default-Portrait.png | 启动页竖屏 | 推荐有 |
1536*2008 |
Default-Portrait@2x.png |
启动页竖屏 |
推荐有 |
748*1024 |
Default-Landscape.png | 启动页横屏 | 推荐有 |
1496*2048 |
Default-Landscape@2x.png | 启动页横屏 | 推荐有 |
iPhone 图片:
大小(像素) |
文件名 | 用途 | 重要度 |
57*57 |
Icon.png |
App store\home |
必须有 |
114*114 |
Icon@2x.png |
App store\home |
推荐有 |
29*29 |
Icon-Small.png |
Setting、Spotlight |
推荐有 |
58*58 |
Icon-Small@2x.png |
Setting、Spotlight |
推荐有 |
320*480 |
Default.png |
启动页 |
推荐有 |
640*960 |
Default @2x.png |
启动页 |
推荐有 |
640*1136 |
Default-568h@2x.png |
iPhone5 启动页 |
推荐有 |
http://developer.apple.com/library/ios/#documentation/userexperience/conceptual/mobilehig/IconsImages/IconsImages.htmlhttp://pinchmultimedia.com/blog/ios-5-icon-sizes-and-names-new-ipad
25、什么是沙盒,文档目录结构的作用
答:IOS 应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒。每个应用程序都有自己的存储空间;应用程序不能翻过自己的围墙去访问别的存储空间的内容;应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
Documents 目录:您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。
AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。
Library 目录:这个目录下有两个子目录:Caches 和 Preferences
Preferences 目录包含应用程序的偏好设置文件。我们不应该直接创建偏好设置文件,而是应该使用 NSUserDefaults 类来取得和设置应用程序的偏好。Caches 目录用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。
获取这些目录路径的方法:1,获取家目录路径的函数:
NSString *homeDir = NSHomeDirectory();
2,获取 Documents 目录路径的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
3,获取 Caches 目录路径的方法:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];
4,获取 tmp 目录路径的方法:
NSString *tmpDir = NSTemporaryDirectory();5,获取应用程序程序包中资源文件路径的方法:例如获取程序包中一个图片资源(apple.png)路径的方法:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple”ofType:@”png”];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];代码中的 mainBundle 类方法用于返回一个代表应用程序包的对象。
26、http 和 socket 区别
答:http 是客户端用 http 协议进行请求,发送请求时候需要封装 http 请求头,并绑定请求的数据,服务器一般有 web 服务器配合(当然也非绝对)。 http 请求方式为客户端主动发起请求,服务器才能给响应,一次请求完毕后则断开连接,以节省资源。服务器不能主动给客户端响应(除非采取 http 长连接技术)。iphone主要使用类是 NSURLConnection。
scoket 是客户端跟服务器直接使用 socket“套接字”进行连接,并没有规定连接后断开,所以客户端和服务器可以保持连接通道,双方都可以主动发送数据。一般在游戏开发或股票开发这种要求即时性很强并且保持发送数据量比较大的场合使用。主要使用类是 CFSocketRef。