ios面试技巧
一、软件开发流程?
软件设计思路和方法的一般过程,包括设计软件的功能和实现的算法和方法、软件的总体结构设计和模块设计、编程和调试、程序联调和测试以及编写、提交程序。
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面试技巧的更多相关文章
- IOS面试攻略
IOS面试攻略(1.0) 2013-10-13 20:58:09| 分类: IOS面试 | 标签:ios知识点总汇 ios面试 |举报|字号 订阅 来自:伊甸网 @ 看到这个关键字,我 ...
- IOS面试问题总结
IOS面试问题总结 分类: IOS开发2013-11-20 17:26 10458人阅读 评论(1) 收藏 举报 目录(?)[+] 通过网络搜寻和自己总结经历找了一些IOS面试经常被问道的问题 ...
- web前端工程师面试技巧 常见问题解答
web前端工程师面试技巧 常见问题解答 每年的春招是各企业需求人才的黄金时期,不少的前端大牛或者前端新手在面试时候不知道怎么来回答面试官的问题,下面来看下我转载的这篇文章吧,希望对从事前端工作的你有所 ...
- iOS面试高薪,进阶 你会这些呢嘛?(持续更新中)
这个栏目将持续更新--请iOS的小伙伴关注!做这个的初心是希望能巩固自己的基础知识,当然也希望能帮助更多的开发者! 基础>分析>总结 面试 iOS常见基础面试题(附参考答案) iOS底层原 ...
- Android面试技巧 找安卓开发工作同学可以看看!
马上就要学完安卓毕业了,最近总想写点什么.今天把自己这段时间的学习心得以及面试时的经验分享给大家: 关于我为什么选择学习安卓并且来华清远见学习,说来话长,但是我要长话短说!首先我以前的实习工作工资太低 ...
- ios面试技术要点
iOS面试 技术总结点(可参考):多线程 运行时 runloop app框架 几种动画编程 jsonmodel原理 sdwebimage原理 masonry怎么应用及原理 应用框架有哪些 说一下Fac ...
- !! 浅谈Java学习方法和后期面试技巧
浅谈Java学习方法和后期面试技巧 昨天查看3303回复33 部落用户大酋长 下面简单列举一下大家学习java的一个系统知识点的一些介绍 一.java基础部分:java基础的时候,有些知识点是非常重要 ...
- iOS 面试基础题目
转载: iOS 面试基础题目 题目来自博客:面试百度的记录,有些问题我能回答一下,不能回答的或有更好的回答我放个相关链接供参考. 1面 Objective C runtime library:Obje ...
- PHP程序员面试技巧之口试题分享
网络上流传很广的一部分php工程师面试题目,有些phper们认为这些很形式,天下面试题目一大把,不能考核一个人的真实水平,其实细细研究起来,无论怎样,能存在就表明其有存在的价值.下面小编整理了12条P ...
随机推荐
- (Tree)94.Binary Tree Inorder Traversal
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tre ...
- 将Web站点由IIS6迁移至IIS7
最近开始着手逐步将所有的Web站点由Win2003+IIS6迁移至64位Win2008+IIS7,基本还算顺利.这里就把相关内容整理总结一下.首先自然是要安装基本运行环境,包括iis,.net fra ...
- 如何生成JavaAPI doc
1 准备工作 1.1 填写完整的注释 对需要生成API的类,填写完整的注释,包括类注释,方法注释,具体格式如下: 类注释: 原先可能author是作者,需要修改成author英文 ...
- Java class file format specfication
Java class file format spec Link: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html Her ...
- Echart图表入门
1.Echart是什么? Enterprise Charts的缩写,商业级数据图表,一个纯Javascript的图表库.更多的内容可以参考网上的资料 2.使用步骤 a.下载开发包 官网地址:http: ...
- django 快速实现完整登录系统
django 实现完整登录系统 本操作的环境: =================== Windows 7 64 python3.5 Django 1.10 =================== 创 ...
- swift 多线程及GCD
1.基本概念 1)进程: 进程是指在系统中正在运行的一个应用程序.每个进程之间是独立的,每个进程运行在其专用且受保护的内存空间里.某进程内的线程在其它进程不可见 2)线程: 1个进程要执行任务,必须有 ...
- 使用Fluent配置表关系
转载MS官方文档:https://msdn.microsoft.com/zh-cn/data/jj591620 Configuring Relationships with the Fluent AP ...
- 6、SQL Server 数据查询
一.使用SELECT检索数据 数据查询是SQL语言的中心内容,SELECT 语句的作用是让数据库服务器根据客户要求检索出所需要的信息资料,并按照规定的格式进行整理,返回给客户端. SELECT 语句的 ...
- chrome调试JavaScript脚本
随着 JavaScript 应用的复杂性逐渐提高,开发者需要有力的调试工具来帮助他们快速发现问题的原因,并且能高效地修复它.Chrome DevTools 提供了一系列实用的工具使得调试 JavaSc ...