__CFRunLoopMode
1 | struct __CFRunLoopMode { |
前提环境:node.js git
1 | mkdir MyBlog |
这个时候应该在console会显示:
Hexo is running at http://0.0.0.0:4000/.
这个时候直接访问该地址,即部署到本地的博客:
在看代码的时候,发现代码中使用到了
1 | - (void)viewDidload |
但是在这个类的propertyA是在init之后去设置的,在viewDidload之前。也就是在使用RAC订阅属性变化信号之前,但是use dataA打印出来了。猜测RACObserve宏生成信号在调用subscribeNext中,直接就调用了dataA的block的逻辑。但是感觉比较奇怪,不应该是propertyA变化的时候才会调用dataA的block的逻辑吗。
现在具体看一下,一个信号的创建和订阅的源码:
1.KVC,字典转化成对象的时候,需要给对象的属性赋值。MJExtentsion是通过KVC实现的,所以对象都需要继承NSObject。
2.Runtime
1)对与某一个类型,通过runtime去查找它自己所有的属性,再根据属性去字典里查找对应的value。
2)通过runtime在运行时给对象增加字段信息,比如记录哪些属性进行转化,哪些属性忽略转化。
3)通过runtime给对应的类增加缓存信息,提高转化效率。
3.递归,针对对象中又包含对象,数组包含对象等情况,通过递归实现属性的赋值。
4.self用在类方法中意思是代表当前类,用在对象方法中代表当前对象。通过一个实例对象的指针调用一个类方法可以这么做:
1 | Class cls = [self class]; |
5.instanceType
1 | + (instancetype)objectWithKeyValues:(id)keyValues |
该方法定义在NSObject中,但在不同的子业务类型中,通过instanceType会返回具体的类型对象。
MlLeaksFinder是app运行的过程中,检测内存泄漏的第三方库,可以帮助在代码调试阶段发现问题。通过method swizzled hook 对象生命周期的方法,在对象结束生命周期的时候,在指定时间之后给对象发送某个消息。如果这个时候对象已经被释放,消息不会被执行,如果没有释放说明发生了内存泄漏,消息就会被执行,从而提醒开发人员。通过递归的方式,会记录下某个视图或者controller的树形节点的位置,能更好的帮助定位到具体哪个对象没有被释放。MLLeaksFinder引入了FBRetainCycleDetector,可以检查循环引用。
内存泄漏分为2种,第1种是对象没有被任何引用,在内存中没有被释放。第2种是对象发生循环引用,无法被释放。在RAC的场景下,通过是2引起的内存泄漏。