iOS程序员笔试题(持续更新)
程序员找工作,无非是两大关,一是面试,二是笔试,关于面试的技巧,我的文章里已经分享过,大家可以看看~今天我给大家分享的是,公司经常出的,并且容易搞混的笔试题!如果这些知识都弄懂了,再加上临场反应能力和一定的技术,我相信一定会拿到公司的邀请的!!
其实IOS程序员的面试题,一般都是比较基础的,一般不会出太难,太深入的问题,但是这些知识往往都容易忽略,而且自己基本上都是自己以前搞混的知识点!我总结了一下,希望对大家有用!!
1.OC与C的区别?
最重要的区别是:
OC是面向对象 C是面向过程
面向过程 是流程化 每一步 都会影响到下一步的执行 甚至到程序是否成功执行完毕
面向对象 不受步骤的约束 在操作的时候 如果没有这个对象 也不会受到严重影响
2.面向对象的三大特征是?
封装 继承 多态
3.内存管理的原则
只要有alloc retain copy (retainCount +1)就要有对应的release(retainCount -1)
谁分配 谁释放
alloc 这个函数 相对对的函数
delloc 销毁对象的时候调用
alloc 给对象分配内存的时候调用
autorelease 与release 的区别
release autorelease 都可以是对象的引用计数-1
release立即释放
autorelease 延迟释放
自动释放池NSAutoreleasePool
实例代理:
for (int i=0; i<10; i++) {
@autoreleasepool {
NSObject *obj = [[[NSObject alloc] init]autorelease];
}
}
4.继承 category的区别
继承 可以添加 变量
调用的时候 可以使用 子类的对象去调用 子类拥有父类的所有属性 方法 包括category 协议。。。
category 只能添加 方法
调用的时候 使用原有类的对象去调用
5.OC里面有多继承么?怎么实现多继承呢
没有多继承 可以多级 继承 可以使用代理 ,分类来实现
6.category estensiton 区别
category 类目 在不改变原有类的情况下 给他扩充方法
estensiton 延展 添加 不公开的 变量 属性 方法
7.什么是protocol?
是协议 是一个 统一的对外接口 可以通过他来实现 查找多个类的方法
8.什么是代理
代理 又叫委托 自己不能完成的 委托给别人完成 可用于回调
9.代理 通知的区别?
代理 是一对一的 代理的接收者,需要把结果返回给发送者结果
通知 是一对多的 发送者,只需要把消息发送出去,不需要返回
10通知 KVO 的区别
KVO 是键值观察者 通过观察的属性值 发生改变 去调用 观察的方法
通知 通过通知名字 来发送 接收通知
11.KVO KVC的区别?
KVC 键值编码 通过把属性名 当成key 来改变属性的值
KVO 键值观察者 通过KVC的方式 把属性当做key 来观察属性值的变化 做出响应
在实际工作中 在哪用到了 KVC KVO
数据转模型 用到了KVC
封装下拉改变导航栏透明度的时候 使用的是KVO
12.readwrite,readonly,assign,retain,copy,nonatomic 、strong、weak属性的作用?并区别
strong(强引用)、 weak(弱引用)?什么情况使用copy,assign,和retain?
readwrite 是可读可写特性;需要生成getter方法和setter方法时
readonly 是只读特性 只会生成getter方法
不希望属性在类外改变
assign 直接赋值 基本数据类型
retain 表示持有(保留)特性 引用计数加1
copy 拷贝一份赋值 会生成一个不受上一个对象影响的对象
nonatomic 非原子操作,决定编译器生成的setter getter是否是原子操作,atomic 原子操作表示多线程安全,UI(主)线程使用 nonatomic
strong强引用->属性所属的对象被释放的时候 这个属性 才会被释放 weak弱引用->不稳定的 可能会被释放掉
13.Objective-C有私有方法么?私有变量呢?如多没有的话,有没有什么代替的方法?
objective-c类里面的方法只有两种, 静态方法和实例方法.但是可以通过把方法的声明和定义都放在.m文件中来实现一个表 面上的私有方法。有私有变量,可以通过@private来修饰,或者把声明放到.m文件中。在Objective‐C中,所有实例变 量默认都是私有的,所有实例方法默认都是公有的
14.c c++ 和obj-c如何混用?
1)obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只
能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj- c的代码,因为cpp只是cpp。
2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题
3)在cpp中混用obj- c其实就是使用obj-c编写的模块是我们想要的。如果模块以类实现,那么要按照cpp class的标准写类的定 义,头文件中不能出现obj-c的东西,包括#import cocoa的。 实现文件中,即类的实现代码中可以使用obj-c的东西,可以import,只是后缀是mm。如果模块以函数实现,那么头文件要按 c的格 式声明函数,实现文件中,c++函数内部可以用obj-c,但后缀还是mm或m。总结:只要cpp文件和cpp include的文件中不包含 obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,而不能直接使用实现代码,实际上cpp混用的是obj-c编译后的o文 件,这个东西其实是无差别的,所以可以用。obj-c的编译器支持cpp。
15.objc优缺点?
objc优点:
1)Cateogies 2)Posing 3)动态识别 4)指标计算 5)弹性讯息传递
6)不是一个过度复杂的C衍生语言 7)Objective-C与C++可混合编程
缺点:
1)不支援命名空間 2)不支持运算符重载 3)不支持多重继承 4)使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化 方法都用不到。(如内联函数等),性能低劣。
16.浅复制和深复制的区别?
浅层复制(copy):只复制指向对象的指针,而不复制引用对象本身。//通过对象的指针来访问这个对象----只赋值地址 深层复制(mutableCopy):复制引用对象本身---再创建一个对象 意思就是有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的 只不过是是一个指针,对象本身资源 还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一 个思想。深复制就好理解了,内存中存在了
两份独立对象本身。//当修改A时,A copy不变。
17.数据持久化存储方式有哪些?以及特点
1.plist 属性列表 最外层只能存储数组字典 里面只能存储 bool NSNumber String Data Date
2.NSUserDefault 最终也是保存成plist 系统封装了保存的路径 保存的方法
3.归档 可以对保存数据的文件 进行加密
4.sqlite 关系型数据库 以表的形式存储 FMDB是对 OC中 sqlite操作封装 的第三方库
5.coreData 是苹果封装的 对文件操作的框架 可以 以对象的形式存储 底层数据文件可以是sqlite类型 也可以是XML JSON …
18.get 和post的区别?
Get:与GETurl封装到一起,长度有限制,安全系数不高。服务器的接收者
Post:与URL参数分开,长度没有限制,安全系数高,服务器的发送者
19.TCP UDP的区别?
TCP:是传输控制协议:是面连接的,那么运行环境必然要求可能性不可丢包,有良好的拥塞控制机制
UDP:是用户数据报协议:主要用在实时性要求高以及对质量相对较若的地方,但面对现在高质量的线路不容易丢包,除非是一些拥塞条件下
20.什么是沙盒?有几个文件夹?
出于安全的目的,应用程序只能将自己的数据和偏好设置写入到几个特定的位置上。当应用程序被安装到设备上时,系统会为其创建一个家目录,这个家目录就是应用程序的沙盒。
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下;
Library:存储程序的默认设置或其它状态信息;
tmp:提供一个即时创建临时文件的地方。
ppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。