码迷,mamicode.com
首页 > 移动开发 > 详细

ios面试技巧

时间:2016-08-11 17:40:44      阅读:288      评论:0      收藏:0      [点我收藏+]

标签:

                                                  

一、软件开发流程?

    软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法、软件的总体结构设计和模块设计、编程和调试、程序联调和测试以及编写、提交程序。 

  1 相关系统分析员和用户初步了解需求,然后用WORD列出要开发的系统的大功能模块,每个大功能模块有哪些小功能模块,对于有些需求比较明确相关的界面时,在这一步里面可以初步定义好少量的界面。 

  2 系统分析员深入了解和分析需求,根据自己的经验和需求用WORD或相关的工具再做出一份文档系统的功能需求文档。这次的文档会清楚例用系统大致的大功能模块,大功能模块有哪些小功能模块,并且还例出相关的界面和界面功能。 

  3 系统分析员和用户再次确认需求。 

  4 系统分析员根据确认的需求文档所例用的界面和功能需求,用迭代的方式对每个界面或功能做系统的概要设计。 

  5 系统分析员把写好的概要设计文档给程序员,程序员根据所例出的功能一个一个的编写。 

  6 测试编写好的系统。交给用户使用,用户使用后一个一个的确认每个功能,然后验收。 

 

举个例子来看: 

  1 某公司想找人订做一套人事管理软件,从某种渠道上得知我们有提供这种服务,所以联系上了我们。 

  2 我们会派专门的软件工程师到他们那里去了解我们要设计一个什么的东西给他们用,然后回来做个方案给他们,其中方案的内容包括:我们开发出来的软件大概的界面是怎样?方便什么人使用?什么人可以使用什么功能?方便到什么程度?大概的硬件要求是怎样等? (这一块是在讲需求从哪获取的,感觉没有必要说这么复杂,就直接说产品经理从客户那里获取产品需求)

  3 他们看了方案后,确定他们就是要做一套这样的软件,我就开始开发这套软件。 

  4 我们把开发出来的软件交用他们使用,其中在使用的过程中哪里使用不方便或哪里达不到要求,我们会第第一时间修改这些功能,直到他们要求的所有功能都能很完美的解决掉。

 

二、项目流程?

项目立项-->需求分析-->总体设计-->详细设计-->开发编程-->测试分析与系统整合-- >

    1.需求分析:通过对客户业务的了解和与客户对流程的讨论对需求进行基本建 模,最 终形成需求规格说明书。

    2.总体设计:通过分析需求信息,对系统的外部条件及内部业务需求进行抽象建模,最终形成概要设计说明文档。

    3.详细设计:此部分在对需求和概要设计的基础上进行系统的详细设计(也包含部分代码说明)。 

    4.开发编程:对系统进行代码编写。

    5.测试分析与系统整合:对所有功能模块进行模拟数据测试及其它相关性测试并整合所有模块功能。

    6.现场支持:系统上线试运行进行现场问题记录、解答。

7.系统运行支持:系统正式推产后,对系统进行必要的维护和BUG修改

 

三、APP发布的上架流程?

(1)在苹果网站的开发者中心,新建一个APP,填写此APP相关的一些描述信息

(2)下载安装发布证书

(3)选择发布证书,使用Archive编译发布包

(4)使用Xcode提交发布包

一、证书导出

需要一个苹果的开发者账号,http://developer.apple.com

申请AppId

申请发布证书(p12格式)

生成provisioning文件

二、Appcan.on在线ipa包编译

三、Ipa包提交苹果AppStore

 

四、算法:递归、冒泡排序、选择排序?

冒泡排序:(简述思想和用法)

思想:两两比较待排序纪录的关键字,发现两个纪录的次序相反时即进行交换,直到没有反序的纪录为止(从第一个数开始比较)

  ina[9] = {12,32,43,23,45,23,12,56,78};

  int index2 = 0;

  for(int index1 = 0; index1<9; index1++){
  //取出第(n+1)个数与前者进行比较

  //比较完第一轮,将最大的数置顶,就好比是气泡一样

  for (index2 = index1+1; index2<9; index2++){

  int variable = 0;

  if(a[index1]<a[index2]){

  variable = a[index1];

  a[index1] = a[index2];

  a[index2] = variable;

     }

   }

}

 

插入排序

思想:在已经排好的序列中用顺序法查找插入位置,找到后将该位置原来的纪录及其后面所有纪录顺序后移一个位置,空出该位置来插入新纪录。(在已经排好的序列中从左向右遍历,找到前一个数大于后一个数,将后一个小的数设为保存值temp,从保存值temp的前一个下标开始及其前面的数字与保存值temp比较,如果此时这个数比保存值大,则将这个数赋值给后一个数,把这个数空出来,继续比较直到比保存值小,然后将temp值赋值给后一个数。)

int  i,j;

for(int i=0;i<9;i++){

   if(a[i]<a[i-1]){

   int temp = a[i];//找到小的值

   for(int j=i-1; j>=0&&a[j]<temp; j--){ //把前面的数都于这个小的值进行比较,如果比temp大则位置后移。

   a[j+1] = a[j];

     }

   a[j+1] = temp;

  }

}

 

递归

能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。特别地,当规模N=1时,能直接得解。

例如:

【问题】 编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。

  斐波那契数列为:0、1、1、2、3、……,即:

  fib(0)=0;

  fib(1)=1;

  fib(n)=fib(n-1)+fib(n-2) (当n>1时)。

写成递归函数有:

int fib(int n){

   if (n==0) return 0;

   if (n==1) return 1;

   if(n>1) return fib(n-1)+fib(n-2);

}

 递归算法的执行过程分递推和回归两个阶段。在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。也就是说,为计算fib(n),必须先计算fib(n-1)和fib(n-2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。依次类推,直至计算fib(1)和fib(0),分别能立即得到结果1和0。在递推阶段,必须要有终止递归的情况。例如在函数fib中,当n为1和0的情况。

 

  在回归阶段,当获得最简单情况的解后,逐级返回,依次得到稍复杂问题的解,例如得到fib(1)和fib(0)后,返回得到fib(2)的结果,……,在得到了fib(n-1)和fib(n-2)的结果后,返回得到fib(n)的结果。

 

  在编写递归函数时要注意,函数中的局部变量和参数知识局限于当前调用层,当递推进入“简单问题”层时,原来层次上的参数和局部变量便被隐蔽起来。在一系列“简单问题”层,它们各有自己的参数和局部变量。

 

  由于递归引起一系列的函数调用,并且可能会有一系列的重复计算,递归算法的执行效率相对较低。当某个递归算法能较方便地转换成递推算法时,通常按递推算法编写程序。例如上例计算斐波那契数列的第n项的函数fib(n)应采用递推算法,即从斐波那契数列的前两项出发,逐次由前两项计算出下一项,直至计算出要求的第n项。

 

 

五、常见几种设计模式:

 

MVC,委托(代理)匿名函数/闭包,观察者(通知、KVO),单例

 

MVC:用模型传递的数据显示在界面上

应用场景:是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。

优势:使系统,层次清晰,职责分明,易于维护

敏捷原则:对扩展开放-对修改封闭

实例:model-即数据模型,view-视图展示,controller进行UI展现和数据交互的逻辑控制。

1、什么是MVC,为什么使用MVC,有什么好处?

答: 分别为: 模型(Model),视图(View)和控制Controller)。

          模型(Model) “数据模型”(Model)用于封装与应用程序的业务逻辑相关的数据以及对数据的处理方法。

        “模型”有对数据直接访问的权力,例如对数据库的访问。

          视图(View) 视图层能够实现数据有目的显示。

          控制器(Controller) 控制器起到不同层面间的组织作用,用于控制应用程序的流程。

2.描述一下iOS SDK中如何实现MVC的开发模式

 答:MVC是:模型--视图--控制  开发模式,对于iOS SDK,所有的View都是视图层的,它应该独立于模型层,由视图控制层来控制。所有的用户数据都是模型层,它应该独立于视图。所有的ViewController都是控制层,由它负责控制视图,访问模型数据

委托(代理)

应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。

优势:解耦合

敏捷原则:开放-封闭原则

 

观察者(通知、KVO)

应用场景:一般为model层对,controller和view进行的通知方式,不关心谁去接收,只负责发布信息。

优势:解耦合

敏捷原则:接口隔离原则,开放-封闭原则

实例:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。

kvo,键值对改变通知的观察者,平时基本没用过。

通知:

发送通知:

[ [NSNotificationCenter  defaultCenter ] postNotificationName:通知名  object:附带的信息]; 

接受通知(观察者):

[ [NSNotificationCenter defaultCenter] addObserver:注册观察者  selector:监听到消息后要做的事情  name:通知名   object:  ]; 

 

 

KVO:

KVO的用法主要就涉及3个部分: 

1.为对象的属性注册观察者:对象通过调用下面这个方法为属性添加观察者 

Object-c代码   

  • - (void)addObserver:(NSObject *)observer  
  •          forKeyPath:(NSString *)keyPath  
  •             options:(NSKeyValueObservingOptions)options  
  •             context:(void *)context  

            

  • observer: 观察者对象. 其必须实现方法observeValueForKeyPath:ofObject:change:context:.
  • keyPath: 被观察的属性,其不能为nil.
  • options: 设定通知观察者时传递的属性值,是传改变前的NSKeyValueObservingOptionOld,还是改变后的NSKeyValueObservingOptionNew. 
  • context: 一些其他的需要传递给观察者的上下文信息,通常设置为nil

2.观察者接收通知,并做出处理:观察者通过实现下面的方法,完成对属性改变的响应: 

Object-c代码   

  • - (void)observeValueForKeyPath:(NSString *)keyPath  
  •                       ofObject:(id)object  
  •                         change:(NSDictionary *)change  
  •                        context:(void *)context  
  • keyPath: 被观察的属性,其不能为nil.
  • object: 被观察者的对象.
  • change: 属性值,根据上面提到的Options设置,给出对应的属性值
  • context: 上面传递的context对象。

 

3.清除观察者:对象通过下面这个方法移除观察者: 

Object-c代码   

  • - (void)removeObserver:(NSObject *)anObserver forKeyPath:(NSString *)keyPath  

 

单例

应用场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。

优势:使用简单,延时求值,易于跨模块

敏捷原则:单一职责原则

例如:

在.h里面声明一个共享实例方法

+ (instancetype)sharedInstance;

.m里面

+ (instancetype)sharedInstance {

    staticViewController *sharedInstance = nil;

    // GCD 实现单例

    staticdispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        // alloc 方法分配内存控件,单例保证只会alloc一次

        sharedInstance = [[selfalloc] init];

    });

    return sharedInstance;

}

 

六、类目、延展、协议

类目(Category) 

     类目就是为已经存在的类添加新的方法。 

     但是不能添加实例变量。 

 Category的使用场景有那些呢:

       1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现

       2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。

Category能实现上面的需求,当然也有使用Category是需要注意的问题:

       1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。

       2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。

       3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。

 

延展:在类的实现文件.m中定义类目叫延展。 

               定义自己的私有方法 

 

协议(Protocol) 

      协议声明了可以被其他的类实现的方法,协议本身不会去实现。 

      协议不是类,只是一个其他对象可以实现的接口。 

      协议可以写在一个类里面,用到的时候引入类的头文件就可以。 

      @requried:必须实现的方法 

      @optional:  可选的实现方法 

定义:@protocol  协议名   //(可选写)<扩展的协议名(例如:NSObject)> 

           @end 

            一个协议可以扩展自另一个协议。 

 

ios面试技巧

标签:

原文地址:http://www.cnblogs.com/comkkk/p/5761481.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!