美文网首页
iOS面试之OC模块

iOS面试之OC模块

作者: 木子心语 | 来源:发表于2019-11-21 17:10 被阅读0次

OC

oc内容如下:
1.分类
2.关联对象
3.扩展
4.代理
5.通知
6.KVO
7.KVC
8.属性关键字

OC.png

1.分类

  • 分类做那些事情?
1.声明私有方法
2.分解体积庞大的类文件
3.把Framwork的私有方法公开
  • 分类特点
- 运行时决议
- 可以为系统类添加分类
  • 分类中都可以添加哪些内容?
- 实例方法
- 类方法
- 协议
- 属性
分类结构体.png
- 分类结构体:
- 分类名称
- class成员变量
- 实例方法的列表
- 类方法的列表
- 协议列表
- 实例属性方法列表 
  • 分类加载调用栈
-objc_init
|
map_2_images(images 镜像)
|
map_images_nolock
|
_read_images
|
remethodize Class
  • 分类总结
- 分类添加的方法可以 覆盖 原类方法
- 同名分类方法谁能生效取决于编译顺序
- 名字相同的分类会引起编译报错

面试题: 是否可以为分类添加成员变量?

2.关联对象

  • 是否可以给分类添加成员变量?
    分类是不能添加实例变量的,但是可以通过关联对象,添加实例变量

  • 关联对象方法

id objc_getAssociatedObject(id object,const void * key)
void objc_setAssociatedObject(id object,const void * key, id value,objc_AssociationPolicy policy)
void objc_removeAssociatedObjects(id object)
  • 关联对象的本质
- 关联对象由AssociationsManager 管理并在 AssociationsHashMap 存储.
- 所有对象的关联内容都在同一个全局容器中.

3.扩展

  • 一般用扩展做什么?
- 声明私有属性
- 声明私有方法
- 声明私有成员变量
  • 扩展特点
- 编译时决议
- 声明的形式存在,多数情况下寄生于宿主类的.m中
- 不能为系统类添加扩展

4.代理

- 一种软件设计模式
- 以@protocol形式体现
- 传递方式一对一
  • 代理流程
代理流程.png
  • 代理方与委托方以什么形式存在
    一般声明为weak以规避循环引用

5.通知

思考-面试题:代理与通知的区别?

通知.png

*通知特点

- 使用观察者模式实现的
- 用于跨层传递消息的机制
- 传递方式一对多
  • 如何实现通知机制?
- 在通知中心,内部维护map表/字典,字典当中,key为通知名,作为字典当中
的key,一个通知名多个value,value作为数组列表,列表元素中包含通知接
收的观察者,观察者回调方法,列表中每个元素通知回调方法相关信息.

6.KVO

  • 什么是KVO?
- KVO是OC对观察者设计模式的实现
- KVO使用isa混写(isa-swizzling)来实现KVO
KVO.png
- 观察者观察 对象A某一成员变量/成员属性
- 系统运行时动态创建NSKVONotifying_A这样的类
- 将A的isa指针指向类NSKVONotifying_A
- NSKVONotifying_A类是原来类的子类,继承关系
- NSKVONotifying_A类重写setter方法,已达到通知所有观察对象
  • KVO
- 使用setter方法改变值KVO才会生效
- 使用setValue:forKey:改变值KVO才会生效
- 成员变量直接修改需手动添加KVO才会生效

7.KVC

  • 什么是KVC
键值编码

-(id)valueForKey:(NSString *)key
-(void)setValue:(id)value forKey:(NSString*)key

思考-面试题:我们通过键值编码技术是否会破坏面向对象的思想?

valueForKey: 与 setValue: forKey: 中的key是没有任何限制的,在我们知道
一个类中私有变量名称的情况下,通过已知的key对成员变量设置/访问,从
这个方面考虑,KVC是会破坏面向对象的思想的.

思考-面试题: valueForKey: 与setValue: forKey:的实现流程?

  • valueForKey:
valueForKey.png
  • setValueForKey:


    setValueForKey.png

8.属性关键字

  • 属性关键字都有哪些?
- 读写权限
- 原子性
- 引用计数
  • 读写权限
- readonly
- readwrite
  • 原子性
- atomic 赋值与获取,保证线程安全
- nonatomic
  • 引用计数
- retain/strong
- assign/unsafe_unretained
- weak
- copy

思考-面试题:assign 与weak 区别?

assign ,修饰基本数据数据烈性,如int
assign,修饰对象类型时,不改变其引用计数
weak,不改变被修饰对象的引用计数
weak,所指对象在被释放之后会自动置为nil

思考-面试题: weak在被释放之后,为什么置为nil?

  • copy
    浅拷贝和深拷贝?


    浅拷贝.png
浅拷贝:对内存地址的赋值,指向同一片内存空间.
深拷贝.png
深拷贝指向两片内容相同的内存空间

浅拷贝和深拷贝区别?

- 是否开辟了新的内存空间
- 是否影响了引用计数

深拷贝开辟了内存空间,浅拷贝不会产生新的内存空间
深拷贝不会影响引用计数,浅拷贝会影响引用计数
  • copy关键字的使用?


    copy关键字的使用.png
- 可变对象的copy和mutableCopy都是深拷贝
- 不可变对象的copy是浅拷贝,mutableCopy是深拷贝
- copy方法返回的都是不可变对象
  • @properyt(copy)NSMutableArray *array (面试题)
- 如果赋值过来的NSMutableArray,copy之后是NSArray
- 如果赋值过来的NSArray,copy之后是NSArray

OC:

  • MRC下如何重写retain修饰变量的setter方法?
@property (nonatomic,reatin) id obj;

-(void)setObj:(id)obj{
   if(_obj != obj){
      [_obj release];
      _obj = [obj retain];
    }
}

面试题:

  • 请简述分类实现原理
- 运行时决议;
- 分类添加的方法可以 覆盖 原类方法;
- 同名分类方法谁能生效取决于编译顺序;
  • KVO的实现原理?
- KVO是OC对观察者设计模式的实现
- KVO使用isa混写(isa-swizzling)来实现KVO
  • 能否为分类添加成员变量?
- 通过关联对象为分类添加成员变量

QQ交流群: 796142709

相关文章

网友评论

      本文标题:iOS面试之OC模块

      本文链接:https://www.haomeiwen.com/subject/oeyoictx.html