iOS_面试题总结

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

2016-08-19  本文已影响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(), ^{

//更新界面

});

上一篇下一篇

猜你喜欢

热点阅读