iOS面试题-第二页

作者: 像羽毛那样轻 | 来源:发表于2016-03-30 10:26 被阅读150次

    11.深拷贝和浅拷贝的理解.

    深拷贝;拷贝的内容.

    浅拷贝:拷贝的指针.

    深拷贝如:

    NSMutableDictionary  * dic = [@{} mutableCopy];

    NSMutableArray  * ary = [@[] mutableCopy];

    12.怎么实现一个singleton的类.

    单例是一种设计模式,对象只有一个.缺点:对象不会被释放,如果创建很多的话会占用很多内存,优点:可以当做工具类使用.

    static SortDetailsModelDown * single = nil;

    +(SortDetailsModelDown *)shareSortDetailsModelDown{

    @synchronized(self){

    if (!single) {

    single = [[SortDetailsModelDown alloc]init];

    }

    }

    return single;

    }

    13.什么是安全释放?

    先释放再置空.

    14.RunLoop是什么?

    事件循环,是线程里面的一个组件.主线程的RunLoop是自动开启的.分为:计时源(timer source),事件源(输入源):input source.防止CPU中断(保证程序执行的线程不会被系统终止).

    Runloop提供了一种异步执行代码的机制,并不能并行执行任务,是事件接收和分发机制的一个实现.每一个线程都有其对应的RunLoop,但是默认非主线程的RunLoop是没有运行的,需要为RunLoop添加至少一个事件源,然后run它.

    一般情况下我们是没有必要去启动线程的RunLoop的,除非你在一个单独的线程中需要长时间的检测某个事件.

    RunLoop,正如其名所示,是线程进入和被线程用来响应事件以及调用事件处理函数的地方.

    input source传递异步事件,通常是来自其他线程和不同程序的消息.

    timer source传递同步事件.

    当有事件发生时,RunLoop会根据具体的事件类型通知应用程序作出响应.

    当没有事件发生时,RunLoop会进入休眠状态,从而到达省电的目的.

    当事件再次发生时,RunLoop会被重新唤醒,处理事件.

    一般在开发中很少会主动创建RunLoop,而通常会把事件添加到RunLoop中.

    15.什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储.

    序列化和反序列化:归档和反归档,进行本地化,进行数据存储.

    CoreData:数据托管.有四种存储方式:xml,sqlite,二进制,内存.

    遵循NSCoding协议之后,进行归档即可实现复杂对象的存储.

    16.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个.

    #define MIN(A,B) (A)>(B)?(B):(A)

    17.iPhone OS 有没有垃圾回收机制,简易阐述一下OC内存管理.

    木有.引用计数,ARC和MRC,swift(自动引用计数).

    18.简述应用程序按HOME键进入后台时的生命周期,以及从后台进入前台时的生命周期.

    前者:- (void)applicationWillResignActive:(UIApplication *)application

    - (void)applicationDidEnterBackground:(UIApplication *)application

    后者:- (void)applicationWillEnterForeground:(UIApplication *)application

    - (void)applicationDidBecomeActive:(UIApplication *)application

    另:

    各个程序运行状态时代理的回调:

    - (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    告诉代理进程启动但还没进入状态保存

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    告诉代理启动基本完成程序准备开始运行

    - (void)applicationWillResignActive:(UIApplication *)application

    当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了

    - (void)applicationDidBecomeActive:(UIApplication *)application

    当应用程序入活动状态执行,这个刚好跟上面那个方法相反

    - (void)applicationDidEnterBackground:(UIApplication *)application

    当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可

    - (void)applicationWillEnterForeground:(UIApplication *)application

    当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。

    - (void)applicationWillTerminate:(UIApplication *)application

    当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。

    - (void)applicationDidFinishLaunching:(UIApplication*)application

    当程序载入后执行

    在上面8个方法对应的方法中键入NSLog打印。

    现在启动程序看看执行的顺序:

    启动程序

    lifeCycle[40428:11303] willFinishLaunchingWithOptions

    lifeCycle[40428:11303] didFinishLaunchingWithOptions

    lifeCycle[40428:11303] applicationDidBecomeActive

    按下home键

    lifeCycle[40428:11303] applicationWillResignActive

    lifeCycle[40428:11303] applicationDidEnterBackground

    双击home键,再打开程序

    lifeCycle[40428:11303] applicationWillEnterForeground

    lifeCycle[40428:11303] applicationDidBecomeActive

    19.ViewController的alloc,loadView,viewDidLoad,viewWillAppear,viewDidUnload,dealloc,init分别是在什么时候调用?在自定义ViewController的时候这几个函数里面应该做什么工作?

    alloc:申请内存时调用.

    loadView:加载视图时调用.

    viewDidLoad;视图已经加载后调用.

    viewWillAppear:视图将要出现时调用.

    viewDidUnload:视图已经加载但是没有加载出来时调用.

    dealloc:销毁该视图时调用.

    init;初始化该视图时调用.

    20.描述应用程序的启动顺序.

    a.程序入口main函数创建UIApplication实例和UIApplication代理实例.

    b.在UIApplication代理实例中重写启动方法,设置根ViewController

    c.在第一ViewController中添加控件,实现应用程序界面.

    相关文章

      网友评论

        本文标题:iOS面试题-第二页

        本文链接:https://www.haomeiwen.com/subject/iqnslttx.html