面试题
1.实现一个冒泡排序或者快速排序
【面试题】intarray[5] = { 28,27,36,45,8};
for (int i = 0;
i < 4;
i++) {
for(int j = 0;
j < 4;
j++) {
if (array[j] > array [j + 1]){
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
}}}
for(int i = 0;
i < 5;
i++) {
printf("%d\n",array[i]);
}
2.iOS平台怎么做数据的持久化?coredata和sqlite有无必然联系?coredata是一个关系型数据吗?
core data是对sqlite的封装,因为sqlite是c语言的api,然而有人也需要obj-c的api,所以有了core data ,另外,core data不仅仅是把c的api翻译成oc的api,还提供了一些管理的功能,使用更加方便。
?App升级之后数据库字段或者表有更改会导致crash,CoreData的版本管理和数据迁移变得非常有用,手动写sql语句操作还是麻烦一些。
?CoreData不光能操纵SQLite,CoreData和iCloud的结合也很好,如果有这方面需求的话优先考虑CoreData。
?CoreData并不是直接操纵数据库,比如:使用CoreData时不能设置数据库的主键,目前仍需要手动操作。
3.Object-c的类可以多重继承么?可以实现多个接口么?category是什么?重写一个类的方式用继承好还是分类好?为什么?
答: Object-c的类不可以多重继承;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。
4.#import跟#include有什么区别,@class呢?#import<>跟#import””有什么区别?
答: #import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import””用来包含用户头文件。
5.属性readwrite,readonly,assin,retain,copy,nonatomic各是什么作用,在哪种情况下用?
答: readwrite是可读可写特性;需要生成getter方法和setter方法时
readonly是只读特性只会生成getter方法不会生成setter方法;
不希望属性在类外改变
assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;
retain表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1;
copy表示拷贝特性,setter方法将传入对象复制一份;需要完全一份新的变量时。
nonatomic非原子操作,决定编译器生成的setter
getter是否是原子操作,atomic表示多线程安全,一般使用nonatomic
6.什么情况下使用关键字weak和assign有何不同?
答:assign指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针;
而weak一旦不进行使用后,永远不会使用了,就不会产生野指针!
7.简述CALayer和UIView的关系
答:UIView和CALayer是相互依赖的关系。UIView依赖与calayer提供的内容,CALayer依赖uivew提供的容器来显示绘制的内容。归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力。UIView来自CALayer,高于CALayer,是CALayer高层实现与封装。UIView的所有特性来源于CALayer支持。
8.KVO的实现原理?
答:KVO:当指定的对象的属性被修改了,允许对象接收到通知的机制。
9.如何给一个对象的私有属性赋值?
答:利用KVC即键值编码来给对象的私有属性赋值.
10.block的本质是什么?为啥在block里面更改外面变量的值,要给外面的变量加_block修饰,加_block修饰的原理是什么?
答: (1) block本质是一个数据类型,多用于参数传递,代替代理方法, (有多个参数需要传递或者多个代理方法需要实现还是推荐使用代理方法),少用于当做返回值传递. block是一个OC对象,它的功能是保存代码片段,预先准备好代码,并在需要的时候执行.
(2)因为使用block代码块可能会引起内部循坏引用,所以应在block定义前加上修饰
11.block在哪种情况下会造成循环引用,如何解决?
答:(1)从两方面分析造成循环引用问题
当self拥有一个block的时候,在block又调用self的方法(或者self所拥有的某个属性)。形成你中有我,我中有你,这种时候会造成循环引用
把某个实例变量变成本地临时变量,强引用将直接指向这个本地临时变量,但本地临时变量一般都会很快释放,所以一般考虑第一种情况
(2)解决方案:对block进行修饰__weak(arc)或__block(mrc)
12.NSRunLoop的实现机制,及在多线程中如何使用?
答案:NSRunLoop是iOS的消息机制的处理模式
>1NSRunloop的主要作用:控制runloop里面线程的执行和休眠,在有事情做的时候使挡墙NSRunloop控制的线程工作,没有事情做让当前runloop的控制线程休眠.
>2.runloop就是一直在循环检测,从线程start到线程end,检测inputsourse(如点击,双击等操作)异步时间,检测timesourse同步事件,见到检测到输入源会执行处理函数,首先会产生通知,corefunction向线程添加runloop observers来监听事件,意在监听事件发生时来做处理。
>3.runloopmode是一个集合,包括监听:事件源,定时器,以及需通知的runloop observers
13.简述视图控制器的生命周期。
1)、init函数(init;
initWithFrame;
initWithCoder;
等)--初始化
2)、awakeFromNib--在loadView之前的工作放在这里
3)、viewDidLoad,一个ViewController一个生命周期内这个函数只会调用一次
4)、viewWillAppear--view将要出现,每次View消失再出现都会调用
5)、viewWillLayoutSubviews--简要对子试图进行布局
6)、viewDidLayoutSubivews--完成对子试图布局
7)、viewDidAppear--视图将要出现在屏幕上
8)、viewWillDisappear--View将要消失
9)viewDidDisappear--View已经消失
14.如何增强iOS应用程序的性能。
1)、使用ARC进行内存管理、2).在适当的情况下使用reuseIdentifier
3).尽可能将View设置为不透明(Opaque)4.避免臃肿的XIBs 5.不要阻塞主线程6.让图片的大小跟UIImageView一样7.选择正确的集合8.使用GZIP压缩
9.重用和延迟加载View 10.缓存、缓存、缓存11.考虑绘制12.处理内存警告13.重用花销很大的对象14.使用Sprite 15.避免重新处理数据16.选择正确的数据格式17.设置适当的背景图片18.降低Web内容的影响19.设置阴影路径20.优化TableView 21.选择正确的数据存储方式
15.请介绍几个常用的git命令。
git branch查看本地所有分支、git status查看当前状态、git commit提交、git branch -a查看所有的分支、git
branch -r查看本地所有分支
推荐阅读
- PMSJ寻平面设计师之现代(Hyundai)
- 杜月笙的口才
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- java中如何实现重建二叉树
- Linux下面如何查看tomcat已经使用多少线程