iOS_2016最新版面试题(附答案)
每天四道题,让精彩填满生活...
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(), ^{
//更新界面
});