iOS面试之OC大全

OC

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

image

1.分类

作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!

推荐阅读

iOS开发——最新 BAT面试题合集(持续更新中)

  • 分类做那些事情?
1.声明私有方法
2.分解体积庞大的类文件
3.把Framwork的私有方法公开

  • 分类特点
- 运行时决议
- 可以为系统类添加分类

  • 分类中都可以添加哪些内容?
- 实例方法
- 类方法
- 协议
- 属性

image
- 分类结构体:
- 分类名称
- 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形式体现
- 传递方式一对一

  • 代理流程
image
  • 代理方与委托方以什么形式存在
    一般声明为weak以规避循环引用

5.通知

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

image

*通知特点

- 使用观察者模式实现的
- 用于跨层传递消息的机制
- 传递方式一对多

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

6.KVO

  • 什么是KVO?
- KVO是OC对观察者设计模式的实现
- KVO使用isa混写(isa-swizzling)来实现KVO

image
- 观察者观察 对象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:
image
  • setValueForKey:

    image

8.属性关键字

  • 属性关键字都有哪些?
- 读写权限
- 原子性
- 引用计数

  • 读写权限
- readonly
- readwrite

  • 原子性
- atomic 赋值与获取,保证线程安全
- nonatomic

  • 引用计数
- retain/strong
- assign/unsafe_unretained
- weak
- copy

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

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

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

  • copy
    浅拷贝和深拷贝?

    image
浅拷贝:对内存地址的赋值,指向同一片内存空间.

image
深拷贝指向两片内容相同的内存空间

浅拷贝和深拷贝区别?

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

深拷贝开辟了内存空间,浅拷贝不会产生新的内存空间
深拷贝不会影响引用计数,浅拷贝会影响引用计数

  • copy关键字的使用?

    image
- 可变对象的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

  • 能否为分类添加成员变量?
- 通过关联对象为分类添加成员变量

文章来源于网络,如有侵权,请联系小编删除。

推荐阅读更多精彩内容

  • 把网上的一些结合自己面试时遇到的面试题总结了一下,以后有新的还会再加进来。 1. OC 的理解与特性 OC 作为一...
    AlaricMurray阅读 913评论 0 16
  • ———————————————回答好下面的足够了---------------------------------...
    恒爱DE问候阅读 875评论 0 4
  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    编程新视野阅读 952评论 4 13
  • 最全的iOS面试题及答案 iOS面试小贴士 ———————————————回答好下面的足够了-----------...
    zweic阅读 1,947评论 0 75
  • 最近几天 ,孩子晚上的学习中断。明天开始坚持,加油(^ω^)。
    养怡之福阅读 22评论 0 0