一句话笔记,某段时间内遇到或看到的某个可记录的点。
- 用短的话说明 Runtime, Runloop Block 概念
- strong 和 copy 的区别,什么时候真正用到 atomic ?
- NSOperationQueue 如何保证调度线程的安全?
一、用短的话说明 Runtime, Runloop 概念
- Runtime 是一套
C语言API
,很好的体现了其运行时机制, 其中最主要的是"消息机制"
, 我们知道C语言的函数调用,在编译时期就决定调用那个函数了,OC在编译时期并不能决定真正调用那个函数,只有在真正运行的时候才会根据函数名称找到对应函数来调用。 - Runloop 是通过内部维护的
事件循环
来对事件或消息
进行管理的一个对象。 - Block 是封装了
函数调用
以及函数调用环境
的OC对象
。
struct Block_layout {
void *isa;
int flags;
int reserved;
void (*invoke)(void *, ...);
struct Block_descriptor *descriptor;
// imported variables
};
struct Block_descriptor {
unsigned long int reserved;
unsigned long int size;
void (*copy)(void *dst, void *src);
void (*dispose)(void *);
};
1.isa指针: 所有对象都有该指针,用于实现对象相关的功能。
2.flags: 附加标识位, 在copy和dispose等情况下可以用到。
3.reserved:保留变量。
4.invoke: 函数指针,指向 block的实现代码, 也可以说是函数调用地址。
5.descriptor: 表示该 block的附加描述信息,主要是 size,以及 copy和 dispose函数的指针。这两个辅助函数在拷贝及丢弃块对象时运行, 其中会执行一些操作, 比方说, 前者要保留捕获的对象,而后者则将之释放。
6.variables: 捕获的变量,block能够访问它外部的局部变量,就是因为将这些变量复制到了结构体中。
二、 strong 和 copy 的区别,什么时候真正用到 atomic ?
- strong 和 copy 都会使引用计数加1,但 strong 是两个指针指向同一个内存地址,copy是在内存中拷贝一份对象,两个指针指向不同的内存地址。
- 在不可变对象之间进行转换,strong 与copy 作用是一样的,但是如果在不可变与可变之间进行操作,那么推荐用 copy。
- 使用atomic 修饰属性,编译器会设置默认读写方法为原子读写,并使用互斥锁添加保护。
@property (readonly) NSInteger maximumFramesPerSecond
- 某些只读的对象。
三、NSOperationQueue 如何保证调度线程的安全?
NSOperationQueue:可以勉强的叫做线程队列的,它是专门管理添加到他里面 NSOperation,然后根据情况,开启线程执行对应的“操作”。
-
如何保证安全
在 NSOperation 实例在多线程上执行是安全的,不需要添加额外的锁。 就是可以说 NSOperation 本身是线程安全的。 -
如何监听状态
通过 KVO 属性的观察,NSOperation类 对其一些属性是键值编码(KVC)和键值观察(KVO)兼容的。
笔记参考: NSOperation的进阶使用和简单探讨
网友评论