您的位置:首页 > 职场人生

最近实习求职过程中同学们被问到的问题汇总

2016-03-06 15:09 369 查看
      虽然到目前为止,没有一个正式的面试电话(心里着实着急啊),但是着急也没有用啊,能做的唯有时刻准备着,准备着电话那头面试官温柔的声音,准备着面试官大人可能要问的问题,准备着HTTP协议、剑指offer、八大排序算法,,,所以还是好好学习,天天向上吧下面是实验室大神被问到的一些问题,做好准备,以免被问到相同的问题:

1:全局静态变量类和单例模式的区别:
相同点:都只有一个对象实例;
静态变量容易出现的问题:
<1>:变量名冲突的问题:这个问题会使项目管理的成本大大增加,项目经理必须小心维护变量名规则,必须分析每一个变量的模块,程序。
<2>:初始化的顺序问题:因为全局变量不可能保证相互之间遵循特定的初始化顺序,这个对于类与对象的实例,构造方法的电泳的顺序有时显得非常重要了。
<3>耦合度的问题:这个全局变量大大增加了函数和模块之间的耦合度,访问某个全局变量的多个函数被该变量牢牢结合在一起,无法拆分开来。
耦合度(Coupling)是对模块间关联程度的度量。耦合的强弱取决与模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。
模块间的耦合度是指模块之间的依赖关系,包括控制关系、调用关系、数据传递关系。模块间联系越多,其耦合性越强,同时表明其独立性越差。
降低模块间的耦合度能减少模块间的影响,防止对某一模块修改所引起的“牵一发动全身”的水波效应,保证系统设计顺利进行
<4>:多线程访问的问题:当多个并发的线程都需要访问某些全局变量的时候,我们必须使用各种同步机制来保护这些变量,防止陷入并发冲突的泥潭。
 
2:单例模式
      单例模式设计思想:保证一个类只有一个对象实例,并提供一个访问的方法,这个时候我们可以将数据封装在一个特殊的类中,然后这个类严格管理它的数据的唯一性,不允许程序员随意创建这个类的对象实例(将构造器不公有化就可以了),便可以用它的静态成员函数得到类的唯一对象实例数据。
      单例模式的优点:<1>单例类可以被用于多态而无需强迫用户只假定唯一的实例(举个例子:你可能在开始时写一个配置,但是以后你可能需要需要支持超过一个配置集,
或者可能需要用户从外部文件中加载一个配置对象,或者编写自己的,你的代码不需要关注全局变量状态,因为你的代码够灵活);
<2>单例可以继承类,实现接口,而静态类能集成类,但不能集成实例成员;
<3>单例可以被延迟初始化,静态类一般在第一次加载时初始化;
<4>单例类可以被集成,它的方法可以被覆写;
 3:在项目什么时候选择使用GCD,什么时候选择NSOperation?(iOS多线程)
项目中使用NSOperation的优点是NSOperation是对线程的高度抽象,在项目中使用它,会使项目的程序结构更好,子类化 NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。
项目中使用GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用。
 4:GCD和NSPerationQueue的区别,以及项目中如何选择使用?
   1》GCD是纯C语言的API,NSOperationQueue是基于GCD的OC版本的封装
    2》GCD只支持FIFO的队列,NSOperationQueue可以很方便的调整执行顺序,可以添加依赖设置最大并发数量。
    3》GCD的执行速度比NSOperationQueue快
    4》NSOperationQueue支持KVO,可以检测Operation是否正在执行,是否结束,是否取消。
如何进行选择?
任务之间不太相互依赖,选用GCD;GCD的优点是GCD本身非常简单、易用,对于不复杂的多线程操作,会节省代码量,而Block参数的使用,会是代码更为易读,建议在简单项目中使用
任务之间有依赖,或者要监听任务的执行情况:NSOperationQueue
 NSOperation的设计思路,是具有面向对象的优点(复用、封装),使得实现是多线程支持,而接口简单,建议在复杂项目中使用。 
3.三种多线程技术的对比 
NSThread:
–优点:NSThread比其他两个轻量级,使用简单
–缺点:需要自己管理线程的生命周期、线程同步、加锁、睡眠以及唤醒等。线程同步对数据的加锁会有一定的系统开销
•NSOperation:
–不需要关心线程管理,数据同步的事情,可以把精力放在自己需要执行的操作上
–NSOperation是面向对象的
•GCD:
–Grand CentralDispatch是由苹果开发的一个多核编程的解决方案。iOS4.0+才能使用,是替代NSThread,
NSOperation的高效和强大的技术
4.GCD的底层实现
1》iOS和OSX的核心是XNU内核(苹果电脑发展的操作系统内核),GCD是基于XNU内核实现的。
2》GCD的API全部在libdispatch库中
3》GCD的底层实现主要有:Dispatch Queue和Dispatch Source
     Dispatch Queue :管理block操作
     Dispatch Source:处理事件(比如说线程间的通信)
5.MVC之间怎么通信?为什么View和Model之间不能通信?
MVC之间怎么通信:controller去model那取数据,告诉view展现数据在屏幕上
Model层不直接和View沟通,当Model层对象改变(比如通过网络获取到了新的数据),它会通知Controller对象,Controller 对象收到通知更新对应的View。当View层有改变(比如用户通过交互创建或修改了数据,称为User Action),View会通过Controller对象去创建或修改Model层的数据。 Model层和View层是相互不知道对方的,它们的沟通是通过Controller这个中间人来协调处理;
为什么View和Model之间不能通信:因为model和界面没有关系。view是要重用的,model和view关联,当model改变后,view得重写;
model不能主动勾搭controller,那model数据有变化了,那怎么让controller知道呢?Notification或KVO机制。当model数据改变,它就广播,controller就收到了。
 
6:KVO底层实现原理: 

  1:KVO是基于runtime机制实现的.
  2.
当某个类的对象第一次被观察时,系统就会在运行期动态的创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法; 派生类在被重写的setter方法中实现真正的通知机制
具体实现步骤:

1、当一个object有观察者时,动态创建这个object的类的子类
2、对于每个被观察的property,重写其set方法、、、 3、在重写的set方法中调用-willChangeValueForKey:和- didChangeValueForKey:通知观察者
4、当一个property没有观察者时,删除重写的方法
5、当没有observer观察任何一个property时,删除动态创建的子类     

7.为什么学习iOS不学Andriod?

答:1、iOS开发比Android简单便利

学习使用一款软件,需要了解深层学习的东西太多了,Android上没有现成的好看的UI控件和机制,很多控件和效果都需要自己自定义实现,这就大大加大了开发Android的难度,而IOS上大部分现成的UI控件和机制就能完成一款不错的应用了。更不需要考虑Android上的几百种机型的适配

2:iPhone 要比Android 流畅,使用起来的手感较好

iOS对屏幕反应的优先级是最高的,它的响应顺序依次为Touch–Media–Service–Core架构,换句话说当用户只要触摸接触了屏幕之后,系统就会最优先去处理屏幕显示也就是Touch这个层级,然后才是媒体(Media),服务(Service)以及Core架构。而Android系统的优先级响应层级则是Application–Framework–Library–Kernal架构,和显示相关的图形图像处理这一部分属于Library,你可以看到到第三位才是它,当你触摸屏幕之后Android系统首先会激活应用,框架然后才是屏幕最后是核心架构。

    
 而iOS系统对图形的各种特效处理基于GPU硬件进行加速的,它可以不用完全借助CPU或者程序本身,而是通过GPU进行渲染以达到更流畅的操控表现。但是Android系统产品则并非如此,因为Android需要适应不同的手机硬件,需要满足各种差异配置,所以很多图形特效大多都要靠程序本身进行加速和渲染,并严重依赖CPU运算的操作自然会加大处理器的负荷,从而出现卡顿的问题

8.进程和线程的区别?(为什么进程比线程切换资源开销大)

一个线程可以创建和撤销另一个线程;同一个进程中的多个线程之间可以并发执行

进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大(进程切换时要切页表,而且往往伴随着页调度,因为进程的数据段代码段要换出去,以便把将要执行的进程的内容换进来。),效率要差一些

9.死锁的概念,死锁产生的条件,项目中遇到死锁么?如何解决的?

死锁:
是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
死锁通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在相互等待,造成了无法执行的情况

  发生死锁的情况一般是两个对象的锁相互等待造成的。
  那么为什么会产生死锁呢?有3个原因:第一,因为系统资源不足;第二,进程运行推进的顺序不合适;第三,资源分配不当。
产生死锁的条件有四个:
  l
互斥条件:所谓互斥就是进程在某一时间内独占资源。
  l
请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  l不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
  l
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

 

     
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  面试