iOS 的技术解释

这几天遇到了几个问题,顺手写下自己的理解,也当抛砖引玉了。

  1. UIButton 引用的 target 是强引用还是弱引用?那么 NSTimer 呢?
    UIControl 文档

The control does not retain the object in the target parameter. It is your responsibility to maintain a strong reference to the target object while it is attached to a control.
https://developer.apple.com/documentation/uikit/uicontrol/1618259-addtarget

NSTimer 文档

The timer maintains a strong reference to this object until it (the timer) is invalidated.

  1. 同步的并行队列运行是如何的?
    有序执行,同步意味着只有一条线程,并行意味着任务按照顺序执行。所以说有序的。同步阻塞当前线程,异步不阻塞当前线程。
  2. UITableView 卡顿的解决方案?
    缓存高度计算,异步渲染,离屏渲染。
  3. Weak 对象为什么释放之后自动设置为 nil ?

id obj1 = 0;(该语句表示指针为空)
objc_storeWeak(&obj1, obj);
objc_destoryWeak函数将0作为参数调用objc_storeWeak函数。
objc_storeWeak(&obj1, 0);
前面的代码与下面的代码相同。
编译器的模拟代码:
id obj1;
obj1 = 0;
objc_storeWeak(&obj1, obj);
objc_storeWeak(&obj1, 0);

objc_storeWeak函数把第二个参数obj赋值对象的内存地址作为键值,将第一个参数附有__weak修饰变量obj1的内存地址注册到weak表中;如果第二个参数为0,则把变量obj1的内存地址从weak表中删除。

对象被废弃的时候会调用objc_clear_deallocating函数,该函数会做如下的处理:

1.从weak表中获取释放对象的地址为键值的记录。
2.将包含在记录中所有附有__weak修饰变量的地址,赋值为nil。
3.从weak表中删除该记录。
4.从引用计数表中删除释放对象的地址为键值的记录。

http://www.jianshu.com/p/050b2d2bc91c

  1. __block 关键字修饰需要被修改的变量的原理是什么?MRC 和 ARC 上有区别吗?
    __block 修饰的外部变量引用,block 是复制其引用地址来实现访问的。ARC 开启的情况下,将只会有 NSConcreteGlobalBlock 和 NSConcreteMallocBlock 类型的 block。
  2. 怎么样能够一直保持线程?
    手动创建的线程都由开发人员管理,所以手动建立线程就能保持线程。
    7.MagicRecord 是如何实现多线程同步的?
  3. 如何实现 KVO 编程?

KVO是基于runtime机制实现的
当某个类的属性对象第一次被观察时,系统就会在运行期间动态地创建该类的一个派生类,在这个派生类中重写基类的任何被观察属性的setter方法。派生类在被重写的setter方法内实现真正的通知机制
如果原类为Person,那么生成的派生类名为NSKVONotifying_Person
我们知道,每一个类中都有一个isa指针指向当前类,所有系统就是在当一个类的对象第一次被观察的时候,系统就会偷偷将isa指针指向动态生成的派生类,从而在被监听属性赋值时被执行的是派生类的setter方法
键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey: 一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey: 会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。
补充:KVO的这套实现机制中苹果还偷偷重写了class方法,让我们误认为还是使用的当前类,从而达到隐藏生成的派生类

  1. 字体适配如何实现?
  2. 响应链的方向?
    hitTest 找到点击的对象,然后向上(superView)查找响应的对应方法。
  3. copy 关键字作用?

(1).NSString、NSArray、NSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary;
(2).block 也经常使用 copy 关键字,具体原因见官方文档:Objects Use Properties to Keep Track of Blocks:

你可能感兴趣的:(iOS 的技术解释)