1.讲一下MVC和MVVM,MVP?
MVC作为老牌架构, 优点在于将业务场景按展示数据类型划分出多个模块, 每个模块中的C层负责业务逻辑和业务展示, 而M和V应该是互相隔离的以做重用, 另外每个模块处理得当也可以作为重用单元. 拆分在于解耦, 顺便做了减负, 隔离在于重用, 提升开发效率. 缺点是没有区分业务逻辑和业务展示, 对单元测试不友好.
MVP作为MVC的进阶版, 提出区分业务逻辑和业务展示, 将所有的业务逻辑转移到P层, V层接受P层的数据更新通知进行页面展示. 优点在于良好的分层带来了友好的单元测试, 缺点在于分层会让代码逻辑优点绕, 同时也带来了大量的代码工作, 对程序员不够友好.
MVVM作为集大成者, 通过数据绑定做数据更新, 减少了大量的代码工作, 同时优化了代码逻辑, 只是学习成本有点高, 对新手不够友好.
MVP和MVVM因为分层所以会建立MVC两倍以上的文件类, 需要良好的代码管理方式.
在MVP和MVVM中, V和P或者VM之间理论上是多对多的关系, 不同的布局在相同的逻辑下只需要替换V层, 而相同的布局不同的逻辑只需要替换P或者VM层. 但实际开发中P或者VM往往因为耦合了V层的展示逻辑退化成了一对一关系(比如SceneA中需要显示"xxx+Name", VM就将Name格式化为"xxx + Name". 某一天SceneB也用到这个模块, 所有的点击事件和页面展示都一样, 只是Name展示为"yyy + Name", 此时的VM因为耦合SceneA的展示逻辑, 就显得比较尴尬), 针对此类情况, 通常有两种办法, 一种是在VM层加状态进而判断输出状态, 一种是在VM层外再加一层FormatHelper. 前者可能因为状态过多显得代码难看, 后者虽然比较优雅且拓展性高, 但是过多的分层在数据还原时就略显笨拙, 大家应该按需选择.
三种架构模式正确详细讲解
2.为什么说Objective-C是一门动态的语言?
object-c类的类型和数据变量的类型都是在运行时确定,而非编译时确定;
多态特性:我们可以使用父类对象来指向子类对象,并且可以用来调用子类的方法;
运行时(runtime)特性:我们可以动态的添加替换方法或者属性;
3.为什么代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?
代理是使用weak来修饰的。使用weak是为了避免循环引用。使用weak修饰的属性,当对象释放的时候,系统会给予空指针nil,不会照成野指针;
delegate:表示代理
dataSource:表示数据源
代理和Block大多是我们都可以用来做倒序传值的。我们都得注意避免循环引用;
代理使用weak修饰,代理必须先声明方法。当我们调用代理的时候要判断是否已经实现;
block使用的是copy来修饰,block保存的是一段代码,其实也就是一个函数。当我们调用block的时候要判断是否已经实现;
4.@dynamic关键字和@synthesize关键字是用来做什么的?
@dynamic :修饰的属性,其getter和setter方法编译器是不会自动帮你生成。必须自己是实现的。
@synthesize:修饰的属性,其getter和setter方法编译器是会自动帮你生成。不必自己实现,可以指定与属性相对应的成员变量。
5.属性的默认关键字是什么?
基本数据类型: atomic,readwrite,assign
OC 对象类型: atomic,readwrite,strong
6.copy和strong
使用strong修饰A不可变类型的时候,并且使用B可变类型给A赋值,再去修改可变类型B值的时候,A所指向的值也会发生改变。strong只是让创建的对象引用计数器+1,并返回当前对象的内容地址,他们指向的内存地址是相同的,是一份内容。
使用copy修饰A不可变类型的时候,并且使用B可变类型给A赋值,再去修改可变类型B值的时候,A所指向的值不会发生改变。用copy的修饰的时候,会拷贝一份内容出来,并且返回指针给A,A指向的内存地址和B指向的内存地址是不相同的,是两份内容。
copy修饰不可变类型(NSString,NSArray等)时候,且使用不可变类型进行赋值,表示浅拷贝,只拷贝一份指针,和strong修饰一样,当修饰的是可变类型(NSMutableArray,NSMutableString等)的时候,且使用可变类型进行赋值,表示深拷贝,直接拷贝新一份内容,到内存中。表示两份内容。
7.如何令自己所写的对象具有拷贝功能?
必须遵循nscopying协议;
如果想实现可变和不可变拷贝时,必须同时遵循nscoping和nsmutablecoping协议。
并且实现:
- (id)copyWithZone:(NSZone *)zone;
8.可变集合类 和 不可变集合类的 copy 和 mutablecopy有什么区别?如果是集合的内容复制的话,集合里面的元素也是内容复制么?
可变集合类使用copy表示深拷贝,不可变集合类使用copy的时候是浅拷贝。
可变集合类使用mutablecopy表示深拷贝,不可变集合类使用copy的时候是浅拷贝。
关于容器实现copy 或 mutableCopy ,容器内元素默认都是指针拷贝,不是内容复制。
9.objc使用什么机制管理对象内存?
使用内存管理计数器,来管理内存的。当内存管理计数器为0的时候,对象就会被释放。
10.数据持久化的几个方案(fmdb用没用过)
plist,存储字典,数组比较好用
preference:偏好设置,实质也是plist
NSKeyedArchiver:归档,可以存储对象
sqlite:数据库,经常使用第三方来操作,也就是 fmdb
coreData:也是数据库储存,苹果官方的
11.用StoryBoard开发界面
简单逻辑页面的跳转是可以使用sb的,开发比较块。
逻辑比较复杂的时候,开发起来比较慢,不利于版本的更新和后期的维护。
sb在项目变异编译的时候,也都会直接加载到内存中,造成内存的浪费。
可以使用xib来代替,编辑复杂逻辑界面时候可以使用纯码编写。