iOS面试题-OC

2017-03-21  本文已影响24人  CyrusCao

1. 如何手动触发一个value的KVO


NSObject 有 willChangeValueForKey:didChangevlueForKey: 两个方法,会在 KVO 的时候调用,我们可以手动重写这两个方法。

2. @protocol 和 category 中使用 @property


3. Runtime


在类中向使用 runtime ,需要先导入<objc/message.h>。

消息机制

objc_msgSend(objc_getClass(“Person”), sel_registerName(“doSth”));

// 或者第一个参数是一个对象:
objc_msgSend(obj, sel_registerName(“doSth”));

// 也可以调用带参数的方法:
objc_msgSend(obj, sel_registerName(@selector(eat:),”food”));

// 注意这里参数和方法名之间是逗号关系

交换方法(method swizzing)

我们在类的 load 方法中进行方法的交换:

+ (void)load
{
  // 获得两个将要交换的方法
  Method oldMethod = class_getClassMethod(self, @selector(oldMethod:));
  Method newMethod = class_getClassMethod(self, @selector(newMethod:));
  // 交换:
  method_exchangeImplamentations(oldMethod, newMethod);
}

动态添加方法

会员机制、收费机制、部分受限制功能,这些都需要动态添加方法来实现。

只要对象调用了一个未实现的方法,就会调用 resolveInstanceMethod: 方法,所以我们可以在这个方法中进行添加:

class_addMethod(类,sel,方法名,类型);

动态添加属性

扩展属性只会生成 accessor 方法,不能在类中访问添加的成员变量,所以我们可以使用 runtime 添加属性:

objc_setAssociatedObject(对象, 属性名称, 属性值, 枚举策略);

访问这个动态添加的属性:

objc_getAssociatedObject(对象, 属性名);

为类添加属性的过程,实际上就是把属性和类关联起来,达到同生共死的目的。

消息转发

_objc_msgForward

4. 方法调用流程


5. 引用和指针的区别


6. 标准宏


#define Min(a,b) (((a)>=(b))?(b):(a))

由于是原样替换,所以要加上括号

7. 自定义对象实现copy


- (id) copyWithZone:(NSZone *)zone
{
  Person *p = [[[self class] allocWithZone] init];
  p.age = _age;
  p.name= _name;
  return p;
}

8. @class 和 #import 以及 @import


9. +load 和 +initialize 的区别是什么?


所以如果类没有被引用进项目,就不会有load调用;但即使类文件被引用进来,但是没有使用,那么 initialize 也不会被调用。

10. 各种修饰符的特点以及使用场合


11. new、alloc/init 的区别


new 相当于一种快捷省事版的 alloc/init,其本质都是开辟内存空间并且初始化对象。但 alloc/init 在内部会使用一个 zone 机制,将相关的对象分配在相邻的内存中,以便检索对象时减少损耗。并且 new 无法在创建对象时给定参数。

12. 深复制与浅复制


13. runtime 中,SEL 和 IMP 的区别


SEL只是方法编号,IMP(implementation) 是方法具体的地址。

14. 为什么 Extension 可以增加实例变量, 而 Category 不可以?


Category 在运行期间进行,但类在内存中的布局已经成型,添加实例变量会危险的修改类的结构。

15. __block__weak修饰符的区别


16. isMemberOfClass 和 isKindOfClass 的异同


两者都能检测一个对象是否是某个类的成员,但后者还可以检测一个对象是否为某个类的后代,而前者却不行。

17. 谈谈instancetype和id的异同


18. atomic和nonatomic的区别,默认是哪个?


19. 向一个nil对象发送消息将会发生什么?


什么都不会发生。

objc是动态语言,每个方法在运行时会被动态转为消息发送,即:objc_msgSend(receiver, selector)。

20. 如何访问并修改一个类的私有属性?


21. accessibility 访问限制修饰符


22. 如何序列化自定义对象?


实现 NSCoding 协议。

23. 如何调试BAD_ACCESS错误?


Xcode 7 已经集成了BAD_ACCESS捕获功能:Address Sanitizer

24. 数据持久化方式以及使用场景


25. 应用程序沙盒的目录结构


沙盒机制使应用之间不能互相访问数据

屏幕快照 2017-01-29 下午4.51.52.png

Documents

将应用程序的数据文件保存在该目录下.不过这些数据类型仅限于不可以再生的数据,可再生的数据文件应该存在LIbrary/Cache下

Library 它有两个子文件

tmp

各种临时文件, 保存应用再次启动时不需要的文件.而且,当应用不在需要这些文件时应主动将其删除,因为该目录下的东西随时有可能被系统清除,目前已知的一种可能清理的原因是系统磁盘存储空间不足的时候

上一篇下一篇

猜你喜欢

热点阅读