一、软件开发流程?

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

  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面试技巧的更多相关文章

  1. IOS面试攻略

    IOS面试攻略(1.0) 2013-10-13 20:58:09|  分类: IOS面试 |  标签:ios知识点总汇  ios面试  |举报|字号 订阅     来自:伊甸网 @ 看到这个关键字,我 ...

  2. IOS面试问题总结

    IOS面试问题总结 分类: IOS开发2013-11-20 17:26 10458人阅读 评论(1) 收藏 举报   目录(?)[+]   通过网络搜寻和自己总结经历找了一些IOS面试经常被问道的问题 ...

  3. web前端工程师面试技巧 常见问题解答

    web前端工程师面试技巧 常见问题解答 每年的春招是各企业需求人才的黄金时期,不少的前端大牛或者前端新手在面试时候不知道怎么来回答面试官的问题,下面来看下我转载的这篇文章吧,希望对从事前端工作的你有所 ...

  4. iOS面试高薪,进阶 你会这些呢嘛?(持续更新中)

    这个栏目将持续更新--请iOS的小伙伴关注!做这个的初心是希望能巩固自己的基础知识,当然也希望能帮助更多的开发者! 基础>分析>总结 面试 iOS常见基础面试题(附参考答案) iOS底层原 ...

  5. Android面试技巧 找安卓开发工作同学可以看看!

    马上就要学完安卓毕业了,最近总想写点什么.今天把自己这段时间的学习心得以及面试时的经验分享给大家: 关于我为什么选择学习安卓并且来华清远见学习,说来话长,但是我要长话短说!首先我以前的实习工作工资太低 ...

  6. ios面试技术要点

    iOS面试 技术总结点(可参考):多线程 运行时 runloop app框架 几种动画编程 jsonmodel原理 sdwebimage原理 masonry怎么应用及原理 应用框架有哪些 说一下Fac ...

  7. !! 浅谈Java学习方法和后期面试技巧

    浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...

  8. iOS 面试基础题目

    转载: iOS 面试基础题目 题目来自博客:面试百度的记录,有些问题我能回答一下,不能回答的或有更好的回答我放个相关链接供参考. 1面 Objective C runtime library:Obje ...

  9. PHP程序员面试技巧之口试题分享

    网络上流传很广的一部分php工程师面试题目,有些phper们认为这些很形式,天下面试题目一大把,不能考核一个人的真实水平,其实细细研究起来,无论怎样,能存在就表明其有存在的价值.下面小编整理了12条P ...

随机推荐

  1. [手机取证] Apple正在行动起来封堵后门?

    在被爆出“后门”事件后,苹果似乎已经开始了自己的行动,在最新发布的iOS 8 Beta5版本中,iOS取证专家Zdziarski提及的众多后台服务中的packet sniffer服务已经被禁用,体现出 ...

  2. XE6 & IOS开发之开发者账号、苹果证书(3):关于在XE6中使用苹果证书的简单介绍

    网上能找到的关于Delphi XE系列的移动开发的相关文章甚少,本文尽量以详细的图文内容.傻瓜式的表达来告诉你想要的答案. 原创作品,请尊重作者劳动成果,转载请注明出处!!! 1.关于在XE6中使用苹 ...

  3. oracle大表添加字段default经验分享

    当oracle单表数据量上亿时,对表进行alter table aa add column_1 varchar2(2) defalut 'Y';时,效率及安全性是必须考虑的因素. 本帖以2亿的数据表a ...

  4. adb shell出错“error: unknown host service”

    已经测试,可用: 在命令行输入adb shell后输出如下错误: adb server is out of date.  killing... ADB server didn't ACK * fail ...

  5. Stopwatch 类

    Stopwatch 为计时器的实现. 主要属性方法 属性和方法 说明 static GetTimestamp() 如果Stopwatch使用高分辨率的性能计数器,则返回该计数器的当前值:如果Stopw ...

  6. AChartEngine 图表绘制

    AChartEngine Android 平台的图表开发库, 能绘制 折线图, 饼图, 气泡图, 柱状图, 散点图, 面积图等统计图表. 这些我记录一下,柱状图.折线图和饼状图的小例子.有兴趣的朋友, ...

  7. 跨域访问CORS

    由于现代浏览器的同源策略,合理的跨域请求也变得至关重要. CORS(Cross-Origin Resource Sharing,跨域资源共享)定义了在必须访问跨域资源时,浏览器与服务器应该如何沟通.它 ...

  8. MySQL 第九天(核心优化三)

    一.昨天内容回顾 索引设计依据 与数据表有关系的sql语句都统计出来 where order by or等等条件的字段适当做索引 原则: 频率高的sql语句 执行时间长的sql语句 业务逻辑重要的sq ...

  9. RedHat6.5更新软件源

    今天在Red Hat上安装软件时,发现需要依赖软件,然而在用sudo yum指令时,出现了下面的错误: This system is not registered to Red Hat Subscri ...

  10. JS splice() 定义和用法

    定义和用法 splice() 方法向/从数组中添加/删除项目,然后返回被删除的项目. 注释:该方法会改变原始数组. 语法 arrayObject.splice(index,howmany,item1, ...