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

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

时间: 2024-07-30 01:56:34

ios面试技巧的相关文章

IOS 面试问题总结

登录|注册     pingchangtan367的专栏 IOS面试问题总结 通过网络搜寻和自己总结经历找了一些IOS面试经常被问道的问题: 1.搞清楚touch事件的传递(事件的响应链) 事件的响应(responder chain) 只有继承了UIResponder的类才能响应touch事件,从上图的响应者链可以看出,优先是最上层的view响应事件,如果该view有视图控制器的话会是下一个响应者,否者就是该view的父视图,这样至上而下传递事件.直到单例UIWindow对象,最后是单例UIAp

【免费算法课】硅谷工程师直播面试技巧!

开课时间: 北京时间 2015-8-23 09:30 (周日a.m.) 美西时间 2015-8-22 18:30 (周六) 课程安排:本课程为网络直播课,每节2小时,共9节,第一节免费试听. 报名网址:http://www.jiuzhang.com/course/  适合谁? 应届毕业生,刚毕业一年以内的同学,想接受系统的面试算法培训的同学,或想换工作的但是算法比较薄弱的工程师.0基础算法即可参与学习. 课程特色 一流师资,硅谷顶尖IT企业工程师在线授课 讲师段誉老师,算法教学经验近10年,就

干货!程序员进好公司的面试技巧

经过一个多月的面试求职,终于获得了一个非常满意的工作机会.作为一个有着两年多iOS开发经验的程序员,第一次裸辞跳槽,对面试求职可谓有一番全新的体会. 技能好不一定就保证你能进入好公司,有时候也需要很多技巧和方法的!最后我能够顺利进入广东地区比较出名的互联网公司,并获得相当可观的待遇,其实是花了很多心思去准备的. 下面是我对这段时间以来求职经验的总结,也包括我此前整理的技巧攻略,希望能帮在寻觅好岗位的程序员同胞们,早日找到最满意的公司. 一.写好简历是拿高薪offer的敲门砖 一个优秀程序员的思维

iOS 开发技巧

快速移除键盘 之前一直是讲view的父类改成control,然后加一个全屏按钮,点击让键盘消失.这个方法要写好多代码,现在一个比较好的方法是重写一个下面的方法: ? 1 2 3 4 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {     [self.view endEditing:YES]; } iOS 开发技巧,布布扣,bubuko.com

iOS 小技巧总结,绝对有你想要的

iOS 小技巧总结,绝对有你想要的 原文链接:http://www.jianshu.com/p/4523eafb4cd4 在这里总结一些 iOS 开发中的小技巧,能大大方便我们的开发,持续更新. —— 由 xcvxvxc分享 在这里总结一些iOS开发中的小技巧,能大大方便我们的开发,持续更新. UITableView的Group样式下顶部空白处理 在viewWillAppear里面添加如下代码: //分组列表头部空白处理 CGRect frame = myTableView.tableHeade

iOS小技巧--用runtime 解决UIButton 重复点击问题

iOS小技巧–用runtime 解决UIButton 重复点击问题 什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的点击也不会出问题, 可是某些场景下还偏偏就是会出问题. 通常是如何解决 我们通常会在按钮点击的时候设置这个按钮不可点击. 等待0.xS的延时后,在设置回来; 或者在操作结束的时候设置可以点击. - (IBAction)clickBtn1:(UIbutton *)sender { sender.enabled = NO; doSomething sender.enabled

iOS面试

高德iOS面试整理(顺序有些乱,一面跪了) 1.简单自我介绍 2.聊c语言 3.两个数比较大小不用if和三目运算符 4.int转化为bit数组 5.多态和隐藏 6.const 和define区别 7.String类实现拷贝构造函数注意事项,是否有必要重写 数据结构 1.树层次遍历 2.链表删除 iOS 1.通知和delegate 2.ViewController 生命周期,  手动代码View添加 3.iOS 的click事件的响应过程 4.通知和KVO比较 5.ARC和非ARC (问到静态分析

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

马上就要学完安卓毕业了,最近总想写点什么.今天把自己这段时间的学习心得以及面试时的经验分享给大家: 关于我为什么选择学习安卓并且来华清远见学习,说来话长,但是我要长话短说!首先我以前的实习工作工资太低,也没有太大的发展前途,特别想找个有前景的工作,我有同学是做软件开发的,月工资都能达到六七千,本人甚是羡慕,一次偶然的机会,和朋友聊天,听说他在华清学嵌入式,老师教的挺好的,他说那也教手机软件的东西,我就在网上搜索了下!很容易就搜到了,看来是公司的名声的确是非常响亮,我想问问题,就跟客服进行交流,我

iOS 面试问题的解答

关于一些 iOS 面试问题的解答 2015年04月26日 这篇 post 主要是对知乎上 iOS程序员的问题列表 的回答, 也算是对自己已有的知识进行整理. 如果你对本篇 post 中的回答有所疑问, 可以在下面留言. 如果有问题, 我一定会修改的 :-) 问题以及回答 1. 什么是 ARC? (ARC 是为了解决什么问题而诞生的?) ARC 是 Automatic Reference Counting 的缩写, 即自动引用计数. 这是苹果在 iOS5 中引入的内存管理机制. Objective