iOS面试题总结 (三)
22 键值编码KVC
KVC全称key valued coding 键值编码
提到KVC,就不能不提反射机制,反射机制就是在运行状态中,对于任意一个类,都能够调用他的所有属性和方法,对于任意一个对象,都能够调用他的任意一个方法和属性,java和C#都有,ObjC也有,所以你根本不必进行任何操作就可以进行属性的动态读写,这就是KVC.KVC的操作方法基本上都由NSKeyValueCoding提供,而他是NSObject的类别,也就是说所以的对象都支持KVC操作。
使用KVC间接修改对象属性时,系统会自动判断对象属性的类型,并完成转换。
KVC可以访问成员变量,无论是否提供get,set方法,无论可见性咋样,是否有readonly修饰。
KVC的主要作用dict和model之间的互转
字典转模型
[self setValuesForKeysWithDictionary:dict];模型转字典
[p dictionaryWithValuesForKeys:array];使用KVC计算属性
举例:[p valueForKeyPath:@"books.@sum.price"]; @avg:平均值
@count:总数
@max:最大
@min:最小
@sum:总数
23 键值观察KVO
键值观察机制是一种能够使对象获取到其它对象属性变化的通知,极大的简化了代码。
实现KVO键值观察模式,被观察的对象必须使用KVC键值编码来修改他的实例变量,这样才可以被观察者观察到,所以说KVC是KVO的基础。
24 协议
概念:定义了一个接口,其他类负责实现这个接口,如果你的类实现了一个协议的方法时,则说明该类遵循此协议
非正式协议:NSObject的类别
协议的修饰符:@required 表示这个方法是必须实现的,@optional,这个表示这个方法是可以实现也可以不实现的,
conformsToProtocol方法--监测一个方法是否遵循某个协议
协议是无类型的,一个协议可以被多个类使用,一个类可以遵循多个协议
25 委托
代理又叫委托,是一种设计模式,代理是对象与对象之间的通讯,代理解除了对象之间的耦合性。
代理可以理解为JAVA重的回调监听机制。
委托步骤
定义协议
创建委托对象,委托对象必须实现委托协议
实现协议方法
26 NSNotification、Block、代理、和KVO的区别。
代理是一种回调机制,且是一对一的关系,通知是一对多。
Delegate比NSNotification效率高
代理和Block一般是一对一的通信
代理需要定义协议方法,代理对象需要实现协议方法,并且需要建立代理关系
Block比较简洁,不需要定义繁琐的协议方法,如果通信事件比较多的话,建议使用代理
27 当我们调用一个静态方法时,需要对对象进行release吗??
- 不需要,静态方法(类方法)创建一个对象时,对象已经被放入自动释放池中
28 static self super关键字的作用
函数体内static变量的作用范围是函数体,该变量只分配一次内存,只初始化一次。
在类中satic成员变量属于整个类所拥有,对类的所有对象只有一份拷贝
self 当前消息的接受者
super 向父类发送消息
29 iOS数据持久化有几种??
属性列表:plist文件
归档:归档通过序列化的形式,键值关系存储到本地,转为二进制流,通过runtime实现自动化归档和解档
遵循NSCodeing协议,需要实现encodeWithCoder和initWithCoder方法,如果是子类继承父类的话,需要实现父类的归档和解档方法
如果需要归档的属性过多,可以使用runtime来进行归档
SQlite数据库-一种关系型数据库
CoreData:通过管理对象进行、增、删、改、查的,他的底层其实还是SQL语句,但是他却是一个对象型数据库
30 CoreData
CoreData介绍
CoreData是面向对象的API,CoreData是iOS中非常重要的一项技术,几乎在所有编写的程序中,CoraData也作为数据存储的基础。
他是苹果官方提供的一套框架,用来解决与对象声明周期管理,对象关系管理和持久化等问题
他提供的是对象-关系映射功能,可以将OC对象转换成数据,保存到SQL中,然后将保存后的数据还原成OC对象。
CoreData的特征
通过CoreData管理应用程序的数据模型,可以极大程度减少需要编写的代码数量。
将对象数据存储在SQLite数据库已获得性能优化。
提供NSFetchResultsController类用于管理表视图的数据,即将Core Data的持久化存储在表视图中,并对这些数据进行管理:增删查改。
管理undo/redo操纵;
检查托管对象的属性值是否正确。
CoreData的6成员对象
NSManageObject:被管理的数据记录Managed Object Model是描述应用程序的数据模型,这个模型包含实体(Entity)、特性(Property)、读取请求(Fetch Request)等。
NSManageObjectContext:管理对象上下文,持久性存储模型对象,参与数据对象进行各种操作的全过程,并监测数据对象的变化,以提供对undo/redo的支持及更新绑定到数据的UI。
NSPersistentStoreCoordinator:连接数据库的Persistent Store Coordinator相当于数据文件管理器,处理底层的对数据文件的读取和写入,一般我们与这个没有交集。
NSManagedObjectModel:被管理的数据模型、数据结构。
NSFetchRequest:数据请求;
NSEntityDescription:表格实体结构,还需知道.xcdatamodel文件编译后为.momd或者.mom文件。
CoreData的功能
对于KVC和KVO完整且自动化的支持,除了为属性整合KVO和KVC访问方法外,还整合了适当的集合访问方法来处理多值关系;
自动验证属性(property)值;
支持跟踪修改和撤销操作;
关系维护,Core Data管理数据的关系传播,包括维护对象间的一致性;
在内存上和界面上分组、过滤、组织数据;
自动支持对象存储在外部数据仓库的功能;
创建复杂请求:无需动手写SQL语句,在获取请求(fetch request)中关联NSPredicate。NSPreadicate支持基本功能、相关子查询和其他高级的SQL特性。它支持正确的Unicode编码、区域感知查询、排序和正则表达式;
延迟操作:Core Data使用懒加载(lazy loading)方式减少内存负载,还支持部分实体化延迟加载和复制对象的数据共享机制;
合并策略:Core Data内置版本跟踪和乐观锁(optimistic locking)来支持多用户写入冲突的解决,其中,乐观锁就是对数据冲突进行检测,若冲突就返回冲突的信息;
数据迁移:Core Data的Schema Migration工具可以简化应对数据库结构变化的任务,在某些情况允许你执行高效率的数据库原地迁移工作;
可选择针对程序Controller层的集成,来支持UI的显示同步Core Data在IPhone OS之上,提供NSFetchedResultsController对象来做相关工作,在Mac OS X上我们用Cocoa提供的绑定(Binding)机制来完成的。
31 Runloop
32 解释self = [super init]方法
- 容错处理,当父类初始化失败,会返回一个nil,表示初始化失败,由于继承的关系,子类是要得到父类的实例和行为,因此我们必须先初始化父类,然后初始化子类
33 栈和堆的区别
栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值, 局部变量的值等,栈是向低地址扩展的数据结构,是一块连续的内存的区域。即栈顶的地址和栈的最大容量是系统预先规定好的。
堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束时由OS回收,向高地址扩展的数据结构,是不连续的内存区域,从而堆获得的空间比较灵活。
碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出.
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
全局区(静态区)(static),全局变量和静态变量的存储是放在一块 的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后有系统释放。
文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。
程序代码区—存放函数体的二进制代码
34 cell重用问题
UITableView通过重用单元格来达到节省内存的目的,通过为每个单元格指定一个重用标示(reuseidentifier),即指定了单元格的种类,以及当单元格滚出屏幕时,允许恢复单元格以便复用。对于不同种类的单元格使用不同的ID,对于简单的表格,一个标示符就够了。
如一个TableView中有10个单元格,但屏幕最多显示4个,实际上iPhone只为其分配4个单元格的内存,没有分配10个,当滚动单元格时,屏幕内显示的单元格重复使用这4个内存。实际上分配的cell的个数为屏幕最大显示数,当有新的cell进入屏幕时,会随机调用已经滚出屏幕的Cell所占的内存,这就是Cell的重用。
35 使用Block有什么好处?使用NSTimer写一个使用Block显示
- Block传值和回调相比代理方便,而且操作也简单,省了很多代码
- NSTimer封装的Block,具体实现
iOS面试题总结 (三)的更多相关文章
- ios面试题(三)
4.写一个setter方法用于完成@property (nonatomic,retain)NSString *name,写一个setter方法用于完成@property(nonatomic,copy) ...
- iOS 面试题(三):为什么 weakSelf 需要配合 strong self 使用 --转自唐巧
问题 继续回答昨天的问题第二问. 我们知道,在使用 block 的时候,为了避免产生循环引用,通常需要使用 weakSelf 与 strongSelf,写下面这样的代码: __weak typeof( ...
- iOS之面试题:腾讯三次面试以及参考思路
使用了第三方库, 有看他们是怎么实现的吗? 例:SD.YY.AFN.MJ等! <1>.SD为例: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...
- 最全的iOS面试题及答案-转载
1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承:可以实现多个接口,通过实现 ...
- IOS面试题总结
iOS面试题: 一:网络理论知识的理解 1:Internet物理地址和IP地址转换采用什么协议 ARP(Address Resolution Protocol)地址解析协议 2:Internet采用哪 ...
- iOS面试题及答案2015.6.7
iOS面试题及答案 1. Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么? 答: Object-c的类不可以多重继承 ...
- [转载]iOS面试题总
转载自:http://blog.sina.com.cn/s/blog_67eb608b0101r6xb.html (2014-06-13 20:23:33) 转载▼ 标签: 转载 crash 原文 ...
- 试答卓同学的 iOS 面试题
卓同学昨天写了一篇文章<4道过滤菜鸟的iOS面试题>.我手痒决定默写一个参考答案.后来发现不认真回答被大家喷成狗,所以决定积极改造,重新做人.下面就是修编之后的答案. 1. struct和 ...
- iOS面试题大全-点亮你iOS技能树
所有的内容大部分来自于网络的搜集,所以我不是一个创造者,而是一个搬运工.我尽量把题目,尤其是参考答案的出处列明.若有任何疑问,建议,意见,请联系我. 第一部分面试题来源于iOS-Developer-I ...
- 原 iOS面试题收集
原 iOS面试题收集 发表于2年前(2013-07-22 13:47) 阅读(369) | 评论(0) 4人收藏此文章, 我要收藏 赞0 听云性能监测产品App.Server.CDN免费试用,绑定 ...
随机推荐
- Android之debug---menu的getActionView()return null
MainActivity代码 @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this a ...
- jQuery打造智能提示插件二(可编辑下拉框)
在上一篇 jQuery打造智能提示插件 上改进,增加下拉按钮,修复点击下拉区域外不隐藏BUG 效果 下拉按钮素材: js封装,注意红色部分为BUG修复,然后传入boxwidth不带px: /* /// ...
- SignalR的Javascript客户端API使用方式整理
SignalR的服务端提供了两种实现方式,分别是PersistentConnection和Hub,这两种方式的侧重点不同: PersistentConnection更接近于底层,编程接口比较简单,传输 ...
- Ionic2学习笔记(10):扫描二维码
作者:Grey 原文地址: http://www.cnblogs.com/greyzeng/p/5575843.html 时间:6/11/2016 说明: 在本文发表的时候(2016-06-1 ...
- javascript设计模式实践之职责链--具有百叶窗切换图片效果的JQuery插件(三)
在上一篇<javascript设计模式实践之模板方法--具有百叶窗切换图片效果的JQuery插件(二)>里,通过采用模板方法模式完成了切换效果对象的构建编写. 接下来就是完成各效果对象的调 ...
- 使用VS Code开发 调试.NET Core 应用程序
使用VS Code开发 调试.NET Core RC2应用程序,由于.NET Core 目前还处于预览版. 本文使用微软提供的示例进行开发及调试. https://github.com/aspnet/ ...
- [WCF编程]10.操作:请求/应答操作
一.调用操作概述 WCF除了支持经典的服务端-客户端的请求/应答操作外,还提供了对其他操作类型的内建支持,包括:即发即弃的单向调用:允许服务将调用返回给客户端的双向回调:允许客户端或服务器处理大量负荷 ...
- C#开发微信门户及应用(29)--微信个性化菜单的实现
有一段时间没有接着微信的主题继续介绍里面的功能模块了,这段时间来,微信也做了不少的变化改动,针对这些特性我全面核对了一下相关的微信公众号和企业号的接口,对原有的微信API和系统管理做了全面的更新,本随 ...
- C#+ArcEngine10.0+SP5实现鼠标移动动态显示要素属性信息
为了解决鼠标移过动态显示要素属性的问题,我在网上先是查到的只能显示单个要素的属性,就是直接在arcmap中设置好的那个tips就可以显示,但是这种显示效果只是简单的实现了显示要素的属性值,可是没有对该 ...
- 图解SQL的Join(转)
对于SQL的Join,在学习起来可能是比较乱的.我们知道,SQL的Join语法有很多inner的,有outer的,有left的,有时候,对于Select出来的结果集是什么样子有点不是很清楚.Codin ...