iOS岗位面试一及小结

版权声明:本文为博主原创文章,未经博主允许不得转载。

上周去一家公司应聘iOS岗位,在此将部分面试题目加以分析,解答仅供参考,欢迎大家纠正,同时在此也对该公司给予面试机会表示感谢。

1,请简述什么是懒加载,懒加载的优点,如果在页面中有一个@property(nonatomic, retain) UILabel *label;属性,请写出懒加载方法(写出核心get方法)。
解答:懒加载——也称为延迟加载,即在需要的时候才加载(加载效率低,占用内存小),通俗的说就是在程序启动的时候不加载资源,只有在运行当需要一些资源时再去加载这些资源。其实就是重写对象的get方法,当系统或者开发者调用对象的get方法时,再去加载对象。如果是懒加载的话则一定要注意先判断是否已经有了,如果没有那么再去进行实例化。
使用懒加载的好处:a,不必将创建对象的代码全部写在viewDidLoad方法中,增加代码可读性。b,每个控件的getter方法中分别负责各自的实例化处理,代码间独立性强,松耦合。c,只有当真正需要资源时,再去加载,节省了内存资源。
- (UILabel *)label {
    // 判断是否已经有了,若没有,则进行实例化
    if(!_label) {
        _label = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 100, 30)];
        [_label setTextAlignment:NSTextAlignmentCenter];
        // ...其它属性值设置
        [self.view addSubview: _label];
    }
    return _label;
}
2,请详细描述你对MVC设计模式的理解。
解答:MVC全名是Model View Controller,是模型(Model)-视图(View)-控制器(Controller)的缩写,是一种常见的设计模式,该模式不仅定义了对象在应用程序中扮演的角色,而且还定义了对象间相互通信的方式,三种类型对象彼此之间通过抽象边界进行分离并且通过这些边界与其它类型对象进行通信。
M:Model(模型)表示应用程序数据模型,管理应用程序数据,封装应用程序特定数据,并定义操控和处理该数据的逻辑和运算。
V:View(视图)应用程序显示数据的部分,是用户看到并与之交互的对象,视图对象知道如何绘制自己,并能够对用户的操作做出响应,主要目的就是呈现应用程序中的模型对象数据并且使其数据可编辑。
C:Controller(控制器)应用程序中处理用户交互的部分,负责M与V的交互,它访问模型中的数据并在视图中展示它们,同时它们还监听事件和根据需要操作数据。模型会把任何数据的变更通知控制器,然后控制器更新视图数据。视图对象通知控制器用户的操作,控制器响应用户的操作根据需要更新模型或者检索被请求的数据。
3,请简述iOS应用程序从前台切换到后台,应用程序的状态改变情况。
解答:首先对应用程序的运行状态做个简单介绍。在任何时刻,应用程序都是下述状态之一,系统通过对一些事件的响应而切换状态。
Not running 未运行 应用程序未启动或运行但已经被系统终止
Inactive 未激活 应用程序在前台运行,但当前并没有接收到事件。(也有可能正在执行其它代码。)当应用要从一个状态切换到另外一个不同状态时,中途过度会短暂停留在此状态
Active 激活 应用程序在前台运行而且接收到了事件。这是应用在前台运行时所处的正常状态。
Background 后台 应用程序在后台执行代码。大多数应用在Suspended之前都会先短暂进入该状态。但是,如果应用请求更多额外的执行时间,该应用会在该状态保持更长一段时间。此外,如果一个应用要求启动时直接进入后台运行,这样的应用会直接从Not Running状态进入Background状态,中间不会经过Inactive状态
Suspended 挂起 应用程序处在后台但是没有执行任何代码。系统会自动将应用转入该状态,并且在转入之前不会发出任何通知。当处于该状态时,应用依然驻留内存但不执行任何代码。当系统发生低内存警告时,系统不会发出任何通知而将处于Suspended状态的应用彻底移除内存从而为前台应用释放更多的内存。
当用户按下Home键或者系统启动另外一个应用时,前台应用首先会切换到Inactive状态,然后切换到Background状态。系统将会自动调用应用委托的applicationWillResignActive:和applicationDidEnterBackground:方法。当applicationDidEnterBackground:方法执行完成后,大部分应用将会在不久后转入Suspended状态。对于请求特定后台任务的应用(如播放音乐)或者那些请求需要额外执行时间的应用,可能会继续执行更长一段时间。所以,我们通常会在applicationDidEnterBackground:方法中保存用户数据或状态信息,尽可能的释放内存,该方法大概有5秒时间,如果超时还未完成任务,程序就会被终止而且从内存中清除。若需要长时间的运行任务,可调用beginBackgroundTaskWithExpirationHandler方法去请求后台运行时间,然后启动一个能长期执行任务的线程。无论是否成功启动执行后台任务的线程,applicationDidEnterBackground:方法都会在5秒内退出。
4,本地通知和远程推送通知的区别。
解答:本地通知(Local Notification)是不需要联网就可以发出的通知,是由本地应用触发的,基于时间行为的一种通知形式。经常用于提醒用户完成一些任务,比如:闹钟定时提醒,生活备注,看电影,待办事项提醒等等。创建一个本地通知步骤为:a,创建UILocalNotification。b,设置处理通知时间fireDate。c,配置通知的内容,包括主体,声音,徽章数字等。d,配置通知传递的自定义数据参数userInfo。e,调用通知,可以使用scheduleLocalNotification: 依照fireDate调度一个通知,也可以使用presentLocalNotificationNow:忽略fireDate而立即调用通知。
远程推送通知(Remote Notification)是从远程服务器(APNs)推送给客户端的通知,需要联网,是由应用服务器提供商发起的,注意APNs和应用服务器不是同一个。经常用于聊天功能(一般非即时聊天),推送App内部新功能等。使用远程推送通知步骤为:a,UIApplication向APNs注册push notification服务。b,获取APNs分配的Device Token。c,把Device Token发送给自己的后台服务器。d,服务器推送消息给客户端(实质是服务器发送消息给APNs,APNs自动将消息推送给客户端。服务器每次推送消息不仅需要客户端的Device Token还需要push证书,对push的内容进行签名)。e,客户端处理收到的通知信息。
注意:在iOS8以后使用两种通知之前都必须先注册通知类型,注册之后首次打开app会弹出提示框询问是否允许接收通知,后续不会再弹出该提示框,但可以在设置中更改该值。
5,请简述沙盒中三个常用文件夹(Documents,Library,tmp)的使用场景。
解答:Documents,一般用来存放应用程序创建的文件,如数据库文件,或在程序中浏览到的文件数据,iTunes备份和恢复的时候会包含该目录。
Library,存储程序的默认设置及其它状态信息,基于NSUserDefaults的首选项参数保存在Library/Preferences下,缓存文件保存在Library/Caches下,iTunes备份和恢复时会包含该目录,但不包含Caches子目录。NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString *path = [path firstObject];可获取对应目录路径。上述NSSearchPathForDirectoriesInDomains方法中的第一个参数表面我们要搜索的目录名称,这里搜索的是Documents目录,将其换成NSLibraryDirectory就表示搜索的是Library目录。第二个参数指定搜索范围。第三个表示是否展开波浪线~。
tmp,存放临时文件,app重启时该目录下的文件清空,iTunes备份和恢复时不包含该目录。NSTemporaryDirectory()可获取该目录路径。
6,请简述你对深拷贝与浅拷贝的理解。
解答:浅拷贝,不拷贝对象本身而仅仅是拷贝指向对象的指针,即浅拷贝只是增加了一个指针指向已经存在的内存,对象的引用计数器加1,其实相当于做了一次retain操作,改变其中一个会影响到另一个。
深拷贝,直接拷贝整个对象内存到另一块内存中,不仅拷贝指向对象的指针而且还拷贝指针指向的内容,即增加一个指针并且申请一个新的内存,使这个增加的指针指向这个新的内存,源对象引用计数器不变,副本计数器设置为1,改变其中一个不会影响到另一个。

你可能感兴趣的:(iOS,面试题)