iOS面试题(六)

1、单例模式优缺点

主要优点:
1、提供了对唯一实例的受控访问。
2、由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
3、允许可变数目的实例。
4、避免对共享资源的多重占用。

主要缺点:
1、不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误,不能保存彼此的状态。
2、由于单利模式中没有抽象层,因此单例类的扩展有很大的困难。
3、单例类的职责过重,在一定程度上违背了“单一职责原则”。
4、滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共享连接池对象的程序过多而出现连接池溢出;如果实例化的对象长时间不被利用,系统会认为是垃圾而被回收,这将导致对象状态的丢失。

2、代理的delegate和dataSource有什么区别?

delegate偏重于与用户交互的回调,有那些方法可以供我使用,例如UITableviewDelegate;dataSource偏重于数据的回调,view里面有什么东西,属性都是什么,例如UITableviewDatasource;

3、timer的间隔周期准吗?为什么?怎样实现一个精准的timer?

计时器不准确的原因是,计时器只有在 runLoop 的一次循环中被检查,所以如果在上次循环中做了什么耗时的操作,那么计时器就被延后执行了。
正确的方法应该是新开一个线程,然后在新开的线程里设定一个 timer,并执行。

__block TestViewController *blockSelf = self; 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
blockSelf->_timer=[NSTimer scheduledTimerWithTimeInterval:1.0 
target:blockSelf 
selector:@selector(caculateLeftTimeForTomorrow) 
userInfo:nil 
repeats:YES] ; 
[[NSRunLoop currentRunLoop] addTimer:blockSelf->_timer forMode:NSDefaultRunLoopMode]; 
[[NSRunLoop currentRunLoop] run]; 
});

4、静态库和动态库在使用上的区别

静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存
注意:项目中如果使用了自制的动态库,不能被上传到AppStore

.a 和 .framework 的使用区别
.a 本身是一个二进制文件,需要配上 .h 和 其它资源文件 才能使用
.framework 本身已经包含了 .h 和 其它资源文件,可以直接使用

5、图片加载的两种方法

  • 方式一:有缓存(图片所占用的内存会一直停留在程序中)
    (UIImage )imageNamed:(NSString )name;
  • 方式二:无缓存(图片所占用的内存会在一些特定操作后被清除)
    NSString path = [[NSBundle mainBundle] pathForResource];
    (UIImage )imageWithContentsOfFile:(NSString )path
    (id)initWithContentsOfFile:(NSString
    )path;
    path是图片的全路径

6、SVN与Git优缺点

1.SVN优缺点
优点:
1、 管理方便,逻辑明确,符合一般人思维习惯。
2、 易于管理,集中式服务器更能保证安全性。
3、 代码一致性非常高。
4、 适合开发人数不多的项目开发。
缺点:
1、 服务器压力太大,数据库容量暴增。
2、 如果不能连接到服务器上,基本上不可以工作,看上面第二步,如果服务器不能连接上,就不能提交,还原,对比等等。
3、 不适合开源开发(开发人数非常非常多,但是Google app engine就是用svn的)。但是一般集中式管理的有非常明确的权限管理机制(例如分支访问限制),可以实现分层管理,从而很好的解决开发人数众多的问题。

2.Git优缺点
优点:
1、适合分布式开发,强调个体。
2、公共服务器压力和数据量都不会太大。
3、速度快、灵活。
4、任意两个开发者之间可以很容易的解决冲突。
5、离线工作。
缺点:
1、学习周期相对而言比较长。
2、不符合常规思维。
3、代码保密性差,一旦开发者把整个库克隆下来就可以完全公开所有代码和版本信息。

7、nil,Nil,NULL,NSNull

Nil:空类
nil:空对象,已经从内存中消失了,再次retain或者添加到数组/字典中会崩溃
NSNull:对象的值为空,但是再次retain或者添加到数组/字典中不会导致程序崩溃
NULL:来自C语言,代表空指针

8、NSInvocation

NSInvocation方法包装了一次方法调用(方法调用者,方法名,方法参数,方法返回值)
方法签名:包括了方法名称,参数,返回值,对方法的描述

NSTimer需要设置一个时间间隔,当时间间隔和屏幕的刷新频率不一样的时候就会出现时间的堆积,出现卡顿的现象。
CADisplayLink的selector执行的时间间隔就是屏幕的刷新频率,所以不会卡。

10、Core Animation

Core Animation是在后台执行的,不会阻塞主线程,只能作用在CALayer上面,不能作用在UIView上面

CAAnimation遵守CAMediaTiming协议,有三个子类CAAnimationGroup(动画组),CAPropertyAnimation(属性动画),CATransition(转场动画)

CAPropertyAnimation有两个子类:CABasicAnimation(基础动画)和CAKeyFrameAnimation(关键帧动画)

  • CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使 用一个NSArray保存这些数值
  • CABasicAnimation可看做是只有2个关键帧的CAKeyframeAnimation

答案都是收集而来,如果有什么错误,欢迎指正!

猜你喜欢

转载自www.cnblogs.com/WinJayQ/p/9109932.html