iOS知识点1

 
  

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来代替,编辑复杂逻辑界面时候可以使用纯码编写。

你可能感兴趣的:(iOS,iOS基础知识点,面试)