iOS面试之OC基础篇(二)

10.readwrite,readonly,assign,retain,copy,nonatomic属性的作用?

  • readwrite是可读可写特性,需要生成getter和setter方法;
  • readonly是只读特性,只会生成getter方法,不会生成setter方法,不希望属性在类外改变;
  • assign是赋值特性,setter方法将传入参数赋值给实例变量;仅设置变量时;assign用于简单数据类型,如NSInteger,double,bool;
  • retain表示持有特性,setter方法将传入参数先保留,再赋值,传入参数的引用计数retaincount会+1;
  • copy表示赋值特性,setter方法将传入对象赋值一份,需要完全一份新的变量时;
  • nonatomic非原子操作,决定编译器生成的setter getter是否是原子操作;
  • atomic表示多线程安全,一般使用 nonatomic;

11.简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别?(重点)

  • KVO(Key-Value-Observing):一对多,观察者模式,键值观察机制,它提供了观察某一属性变化的方法,加大简化了代码;
  • KVC(Key-Value-Coding):是键值编码,一个对象在调用setValue的时候,
    a. 检查是否存在相应的key的set方法,存在就调用set方法;
    b. set方法不存在,就查找_key的成员变量是否存在,存在就直接赋值;
    c. 如果_key没找到,就查找相同名称的key,存在就赋值;
    如果没有就调用valueForUnderfinedKey和setValue: forUndefinedKey;
  • Delegate:通常发送者和接受者是直接一对一的关系,
    a. 代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。
    b. 可以减少框架复杂度,消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然然后发送者响应事件,delegate机制机制使得接收者的行为;
  • Notification:观察者模式,通常发送者和接受者的关系的关系是间接的多对多关系,消息的发送者告知接收者事件已经发生或者将要发送,仅此而已,接收者并不能反过来影响发送者的行为;
区别:
  • 效率肯定是delegate比NSNotification高;
  • delegate方法比notification更加直接,需要关注返回值,所以delegate方法往往包含should这个很传神的词。相反的,notification最大的特色就是不关心结果,所以notification往往用did这个词;
  • 两个模块之间联系不是很紧密,就用notification传值,例如多线程之间传值用notification;
  • delegate只是一种较为简单的回调,且主要用在一个模块中,例如底层功能完成了,需要把一些值传到上层去,就是事先把上层的函数通过delegate传到底层,然后在底层call这个delegate,它们都在一个模块中,完成一个功能,例如说NavigationController 从B界面到A界面 点击=返回按钮(调用popViewController方法)可以用delegate比较好;

12.懒加载(What is laze loading ?)

  • 就是懒加载只在用到的时候才去初始化,也可以理解成延时加载。一个简单的例子:tableView中图片的加载显示了,一个延时加载,避免内存过高,一个异步加载,避免线程堵塞提高用户体验

13.OC有多继承吗?没有的话可以用什么方法代替?

  • 多继承即一个子类可以有多个父类,它继承了多个父类的特性;
  • Object-c的类没有多继承,只支持单继承,如果要实现多继承的话,可以通过类型别和协议的方式来实现;
    *protocol(协议)可以实现多个接口,通过实现多个接口可以完成多继承;
  • Category(类别)一般使用分类,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系;

14.分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?

  • 类别:在没有原类.m文件的基础上,给该类添加方法;
  • 延展:一种特殊形式的类别,主要在一个类的.m文件里声明和实现延展的作用,就是给某类添加私有方法或是私有变量;
  • 两个的区别:
    a. 延展可以添加属性并且它添加的方法是必须要实现的,延展可以认为是一个私有的类目;
    b. 类别可以在不知道,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改;
    c. 并且如果类别和原来类中的方法名称产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级别;
    d. 继承可以增加,修改删除方法,添加属性;
  • Category只能为对象添加方法,却不能添加成员变量的原因:如果可以添加成员变量,添加的成员变量没有办法初始化;

你可能感兴趣的:(iOS面试之OC基础篇(二))