美文网首页iOS_面试题总结
iOS_2016最新版面试题(附答案)

iOS_2016最新版面试题(附答案)

作者: 格蓝_ | 来源:发表于2016-08-19 11:35 被阅读80次

    每天四道题,让精彩填满生活...

    1、简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic、atomic、strong、weak属性的作用?え

    答:Objective - C 是使用引用计数的概念来进行内存管理的,当一个对象在创建之后它的引用计数器值+1,当调用这个对象的alloc、retain、new、copy方法之后引用计数器值自动在原来的基础上+1,当调用这个对象的release方法之后它的引用计数器值-1,如果一个对象的引用计数器值为0,则系统会自动调用这个对象的dealloc方法来销毁这个对象。

    与retain配对使用的方法是release, 与alloc 配对使用的方法是dealloc, 因为retain 就要销毁,创建就要释放;

    readwrite 是可读可写(set 和 get 方法)    readonly 是只读 (只有set方法) assign 是只取 (只有get方法) retain/copy 赋值并且引用计数+1 nonatomic/atomic 原子性和非原子性 (保证多线程安全) 

    strong/weak 两者都是在ARC下使用的,strong 相当于retain, weak 相当于assign,可以把对应的指针变量置空。ps:xcode4.2用retain 和assign,xcode4.3 或以上版本用strong 与weak 。

    assign 修饰一般类型, retain 修饰对象类型。


    2、类变量的@protected ,@private,@public,@package,声明各有什么含义?

    答:首先它们都是存取权限的设定,换句话而言就是变量的作用域

    @protected:受保护的,只有本类和子类可以调用;

    @private:私有的,只有本类可以调用;

    @public:公共的,全局可以调用,也可以放到其他模块去调用,开放性最大。

    @package:本包内可以使用,跨包不可以使用;ps:苹果的官方文档是这么解释的:这个实例变量最有效的范围 in framework classes。


    3、线程是什么?进程是什么?二者有什么区别和联系?

    答:线程和进程都是操作系统所负责的程序运行的基本单元,系统通过该基本单元实现对程序的并发性。

    线程和进程两者之间的区别和联系:它们是操作系统的两种不同的资源管理方式,进程有自己独立的地址空间,所以一个进程奔溃后,在保护模式下不会对其他进程产生影响。而线程只是一个进程中不同的执行路线,线程有自己的堆区、栈区和局部变量,但是线程没有独立的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健硕。

    但是进程切换时,耗费资源较大,效率要差一些,但是对于一些要求同时进行并要共享某些变量的并发操作,只能用线程,不能使用进程。


    4、谈谈你对多线程开发的理解,iOS中有几种实现多线程的方法。

    答:多线程开发的优缺点:

    优点:

    1〉使用多线程可以把程序中耗时较长的任务放到后台去处理,如加载图片、视频等等。

    2〉发挥多核处理器的优势,并发执行让系统运行的更快、更流畅,用户体验更好。

    缺点:

    1〉大量的线程会减低代码的可读性

    2〉更多的线程需要更多的内存空间

    3〉当多个线程对同一资源进行争夺时,要注意线程安全 。ps:比如说加线程锁之类的操作。

    iOS 一共有三种创建多线程的方法:

    1〉NSThread 

    //  第一种创建方式

    [NSThread detachNewThreadSelector:@selector(doSomething:) toTarget:self withObject:nil];

    第二种创建方式

    NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(doSomething:) object:nil];

    2〉NSOperationQueue

    NSOperationQueue*oprationQueue= [[NSOperationQueuealloc] init];

    oprationQueueaddOperationWithBlock:^{

    //这个block语句块在子线程中执行

    }

    3〉GCD

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    //耗时的操作

    dispatch_async(dispatch_get_main_queue(), ^{

    //更新界面

    });

    相关文章

      网友评论

        本文标题:iOS_2016最新版面试题(附答案)

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