2二、iOS面试题·自整理·Four

1.为何代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?

A:为了不循环引用。weak指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制。strong该对象强引用delegate,外界不能销毁delegate对象,会致使循环引用。DataSource是关于View的内容的东西包括属性,数据等等,而Delegate则是一些咱们能够调用的方法,全是操做。block和代理都能解决对象间交互的问题,block更轻型,更简单,可以直接访问上下文,代码一般在同一个地方,这样读代码也连贯。缺点是容易引发循环引用。delegate更重一些,须要实现接口,它的方法分开来,不少时候须要存储一些临时数据,另外相关的代码须要分离到各处没有block好读,其优势就是它是用weak关键字修饰的,不会引发循环引用。缓存

2.属性的实质是什么?包括哪几个部分?属性默认的关键字都有哪些?@dynamic关键字和@synthesize关键字是用来作什么的?

A:属性的本质是@property = ivar+getter+setter,也就是说@property系统会自动生成getter和setter方法。属性默认的关键字包括atomic,nonatomic,@synthesize,@dynamic,getter=getterName,setter=setterName,readwrite,readonly,assign,retain,copy。
@dynamic:表示变量对应的属性访问器方法,是动态实现的,你须要在 NSObject 中继承而来的 +(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定 动态实现的方法或者函数。
@synthesize:若是没有实现setter和getter,编译器可以自动实现getter和setter方法。安全

3.NSString为何要用copy关键字,若是用strong会有什么问题?(注意:这里没有说用strong就必定不行。使用copy和strong是看状况而定的)

A:针对于当把NSMutableString赋值给NSString的时候,才会有不一样,用copy的话NSString的值不会发生变化,用strong则会发生变化,随着NSMutableString的值变化。若是是赋值是NSString对象,那么使用copy仍是strong,结果都是同样的,由于NSString对象根本就不能改变自身的值,他是不可变的。并发

4.如何令本身所写的对象具备拷贝功能?

A:若想让本身写的对象具备拷贝功能,则须要实现NSCopying协议。若是自定义的对象分为可变版本和非可变版本,那么就要同时实现NSCopying和NSMutableCopying协议,不过通常没什么必要,实现NSCopying协议就够了。app

5.可变集合类 和 不可变集合类的 copy 和 mutablecopy有什么区别?若是是集合是内容复制的话,集合里面的元素也是内容复制么?

A:对于不可变对象,copy操做是浅复制,mutableCopy是深复制。对于不可变对象,mutableCopy不只仅是深复制,返回的对象类型仍是不可变对象类型相应的可变对象的类型。内容复制也就是深拷贝,集合的深复制有两个方法,能够用initWithArray:copyItems:将第二个参数设置为YES便可进行深复制,如:NSDictionary shallowCopyDict = [NSDictionary alloc]initWithDictionary:someDictionary copyItems:YES];若是用这个方法深复制,集合里的每一个元素都会收到copyWithZone:消息。若是集合里的对象遵循NSCopying协议,那么对象就会深复制到新的集合。若是对象没有遵循NSCopying协议,而尝试用这种方法进行深复制则会出错。copyWithZone:这种拷贝方式只能提供一层内存拷贝,而非真正的深拷贝。第二种方法是将集合进行归档解档,如:NSArray trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];异步

6.为何IBOutlet修饰的UIView也适用weak关键字?

A:由于既然有外链那么视图在xib或者storyboard中确定存在,视图已经对它有一个强引用了。async

7. nonatomic和atomic的区别?atomic是绝对的线程安全么?为何?若是不是,那应该如何实现?

A:nonatomic和atomic的区别在于二者自动生成getter和setter的方法不同,若是你本身写getter和setter方法,那么(getter,setter,retain,copy,assign)只起提示做用,写不写都同样。
对于atomic的属性,系统生成的getter和setter会保证get,set的操做完整性,不受其余线程影响。好比线程A的getter方法运行到一半,线程B调用了setter,那么线程A的getter仍是能获得一个完整的对象。
而nonatomic就没有这个保证了,因此速度要比atomic快。
不过atomic可不能保证线程安全,若是线程A调用了getter,与此同时线程B和线程C都调了setter,那最后线程Aget到的值,三种都有可能:多是B,C set以前原始的值,也多是B set的值,也多是C set的值。同时这个最终的值,也多是B set的值,也多是C set的值。要保证安全,可使用线程锁。函数

8.UICollectionView自定义layout如何实现?

A:UICollectionViewLayoutAttributes,UICollectionViewFlowLayout。oop

9.用StoryBoard开发界面有什么弊端?如何避免?

A:难以维护,若是须要改动全局的一个字体,若是是代码的话就很好办,pch或头文件中改动就行了。若是是storyboard中就须要一个一个改动很麻烦。
若是storyboard中scene太多,打开storyboard会比较慢。
错误定位比较困难,好多错误提示模棱两可。字体

10.进程和线程的区别?同步异步的区别?并行和并发的区别?

A:进程是一个内存中运行的应用程序,好比在Windows系统中,一个运行的exe就是一个进程。
线程是指进程中的一个执行流程。
同步是顺序执行,执行完一个再执行下一个。须要等待,协调运行。
异步就是彼此独立,在等待某事件的过程当中继续作本身的事,不须要等待这些事件完成后再工做。
并行和并发 是前者至关于三我的同时吃一个馒头,后者至关于一我的同时吃三个馒头。
并发性(Concurrence):指两个或两个以上的事件或活动在同一时间间隔内发生。并发的实质是一个物理CPU(也能够多个物理CPU) 在若干道程序之间多路复用,并发性是对有限物理资源强制行使多用户共享以提升效率。
并行性(parallelism)指两个或两个以上事件或活动在同一时刻发生。在多道程序环境下,并行性使多个程序同一时刻可在不一样CPU上同时执行。
区别:(并发)一个处理器同时处理多个任务和(并行)多个处理器或者是多核的处理器同时处理多个不一样的任务。atom

11.线程间通讯?

A:NSThread、GCD、NSOperation。

12.GCD的一些经常使用的函数?(group,barrier,信号量,线程同步)

A:1.延迟执行任务函数:dispatch_after(.....)。
2.一次性执行dispatch_once(...)。
3.栅栏函数dispatch_barrier_async/dispatch_barrier_sync。
4.队列组的使用dispatch_group_t。
5.GCD定时器。

13.如何使用队列来避免资源抢夺?

A:dispatch_barrior_async 做用是在并行队列中,等待前面两个操做并行操做完成。

14.数据持久化的几个方案(fmdb用没用过)

A:Coredata,realm,fmdb。

15.说一下AppDelegate的几个方法?从后台到前台调用了哪些方法?第一次启动调用了哪些方法?从前台到后台调用了哪些方法?

A:
1.当程序第一次运行而且将要显示窗口的时候执行,在该方法中咱们完成的操做

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

2.程序进入后台的时候首先执行程序将要取消活跃该方法

- (void)applicationWillResignActive:(UIApplication *)application

3.该方法当应用程序进入后台的时候调用

- (void)applicationDidEnterBackground:(UIApplication *)application

4.当程序进入将要前台的时候调用

- (void)applicationWillEnterForeground:(UIApplication *)application

5.应用程序已经变得活跃(应用程序的运行状态)

- (void)applicationDidBecomeActive:(UIApplication *)application

6.当程序将要退出的时候调用,若是应用程序支持后台运行,该方法被applicationDidEnterBackground:替换

- (void)applicationWillTerminate:(UIApplication *)application

16.NSCache优于NSDictionary的几点?

A:NSCache 是一个容器类,相似于NSDIctionary,经过key-value 形式存储和查询值,用于临时存储对象。
注意一点它和NSDictionary区别就是,NSCache 中的key没必要实现copy,NSDictionary中的key必须实现copy。
NSCache中存储的对象也没必要实现NSCoding协议,由于毕竟是临时存储,相似于内存缓存,程序退出后就被释放了。

17.知不知道Designated Initializer(指定初始化函数)?使用它的时候有什么须要注意的问题?

A:好比:

- (instancetype)initWithNibName:(nullable NSString *)nibNameOrNil bundle:(nullable NSBundle *)nibBundleOrNil NS_DESIGNATED_INITIALIZER; - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;

18.实现description方法能取到什么效果?

A:1.NSLog(@"%@", objectA);这会自动调用objectA的description方法来输出ObjectA的描述信息.
2.description方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址)
3.description方法是基类NSObject 所带的方法,由于其默认实现是返回类名和对象的内存地址, 这样的话,使用NSLog输出OC对象,意义就不是很大,由于咱们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。所以,会常常重写description方法,覆盖description方法的默认实现。

19.objc使用什么机制管理对象内存?

A:经过 retainCount 的机制来决定对象是否须要释放。 每次 runloop 的时候,都会检查对象的 retainCount,若是retainCount 为 0,说明该对象没有地方须要继续使用了,能够释放掉了。

20.block的实质是什么?一共有几种block?都是什么状况下生成的?

A:block对象就是一个结构体,里面有isa指针指向本身的类(global malloc stack),有desc结构体描述block的信息,forwarding指向本身或堆上本身的地址,若是block对象截获变量,这些变量也会出如今block结构体中。最重要的block结构体有一个函数指针,指向block代码块。block结构体的构造函数的参数,包括函数指针,描述block的结构体,自动截获的变量(全局变量不用截获),引用到的block变量。(block对象也会转变成结构体)block代码块在编译的时候会生成一个函数,函数第一个参数是前面说到的block对象结构体指针。执行block,至关于执行block里面forwarding里面的函数指针。

相关文章
相关标签/搜索