AFNetworking-RequestSerializer

概况介绍:

这篇主要介绍AFNetworking中请求参数序列化的部分,具体代码在AFURLRequestSerialization中。AFURLRequestSerialization包含四部分:

阅读全文

CFRunLoop

数据结构

__CFRunLoopMode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 struct __CFRunLoopMode {
CFRuntimeBase _base;
pthread_mutex_t _lock; /* must have the run loop locked before locking
this */
//mode名
CFStringRef _name;
Boolean _stopped;
char _padding[3];
//source0 源
CFMutableSetRef _sources0;
//source1 源
CFMutableSetRef _sources1;
//observer 源
CFMutableArrayRef _observers;
//timer 源
CFMutableArrayRef _timers;

//mach port 到 mode的映射,为了在runloop主逻辑中过滤runloop自己的port消息。
CFMutableDictionaryRef _portToV1SourceMap;

//记录了所有当前mode中需要监听的port,作为调用监听消息函数的参数。
__CFPortSet _portSet;
CFIndex _observerMask;
#if USE_DISPATCH_SOURCE_FOR_TIMERS
dispatch_source_t _timerSource;
dispatch_queue_t _queue;
Boolean _timerFired; // set to true by the source when a timer has fired
Boolean _dispatchTimerArmed;
#endif
#if USE_MK_TIMER_TOO
//使用 mk timer, 用到的mach port,和source1类似,都依赖于mach port
mach_port_t _timerPort;
Boolean _mkTimerArmed;
#endif
//timer触发的理想时间
uint64_t _timerSoftDeadline; /* TSR */
//timer触发的实际时间,理想时间加上tolerance(偏差)
uint64_t _timerHardDeadline; /* TSR */
};

阅读全文

RunLoop介绍

RunLoop 的概念

1
2
3
4
5
6
7
function loop() {
initialize();
do {
var message = get_next_message();
process_message(message);
} while (message != quit);
}

阅读全文

hexo+github搭建博客

前提环境:node.js git

1.hexo安装

1
2
3
4
5
6
mkdir MyBlog
cd MyBlog
npm install hexo-cli -g
hexo init
npm install
hexo server

这个时候应该在console会显示:

Hexo is running at http://0.0.0.0:4000/.

这个时候直接访问该地址,即部署到本地的博客:

本地hexo博客

阅读全文

Runloop和多线程

CFRunloop中已经说明了一个线程及其runloop的对应关系 ,现在以iOS中NSThread的实际使用来说明runloop在线程中的意义。

阅读全文

ReactiveCocoa2

RACCommand

理解:个人觉得是对RACSignal的封装,侧重于对事件的信号的封装。有了RACComand,就可以把动作通过它很方便的放到ViewModel中,类似于以下这种方式:

阅读全文

ReactCocoa源码分析1

问题1

在看代码的时候,发现代码中使用到了

1
2
3
4
5
6
7
8
9
10
11
12
13
- (void)viewDidload
{
[super viewDidload];
[self bindData];
}

- (void)bindData
{
[[RACObserve(self, propertyA) ignore:nil]
subscribeNext:^(NSArray *dataA) {
NSLog(@"use dataA");
}];
}

但是在这个类的propertyA是在init之后去设置的,在viewDidload之前。也就是在使用RAC订阅属性变化信号之前,但是use dataA打印出来了。猜测RACObserve宏生成信号在调用subscribeNext中,直接就调用了dataA的block的逻辑。但是感觉比较奇怪,不应该是propertyA变化的时候才会调用dataA的block的逻辑吗。

现在具体看一下,一个信号的创建和订阅的源码:

阅读全文

MJExtension

总结

1.KVC,字典转化成对象的时候,需要给对象的属性赋值。MJExtentsion是通过KVC实现的,所以对象都需要继承NSObject。

2.Runtime

1)对与某一个类型,通过runtime去查找它自己所有的属性,再根据属性去字典里查找对应的value。

2)通过runtime在运行时给对象增加字段信息,比如记录哪些属性进行转化,哪些属性忽略转化。

3)通过runtime给对应的类增加缓存信息,提高转化效率。

3.递归,针对对象中又包含对象,数组包含对象等情况,通过递归实现属性的赋值。

4.self用在类方法中意思是代表当前类,用在对象方法中代表当前对象。通过一个实例对象的指针调用一个类方法可以这么做:

1
2
Class cls = [self class];
[cls classMethod];

5.instanceType

1
+ (instancetype)objectWithKeyValues:(id)keyValues

该方法定义在NSObject中,但在不同的子业务类型中,通过instanceType会返回具体的类型对象。

阅读全文

AFNetworking-NSOperation

基本内容

本节主要介绍iOS中多线程相关的内容,先简单介绍NSOperation的使用,然后结合GCD实现任务之间的管理,比如每个任务完成之后的处理以及任务与任务之间的依赖,所有任务完成之后的处理等,通过AFNetworking源码分析其具体实现。

阅读全文

MLLeaksFinder

基本原理:

MlLeaksFinder是app运行的过程中,检测内存泄漏的第三方库,可以帮助在代码调试阶段发现问题。通过method swizzled hook 对象生命周期的方法,在对象结束生命周期的时候,在指定时间之后给对象发送某个消息。如果这个时候对象已经被释放,消息不会被执行,如果没有释放说明发生了内存泄漏,消息就会被执行,从而提醒开发人员。通过递归的方式,会记录下某个视图或者controller的树形节点的位置,能更好的帮助定位到具体哪个对象没有被释放。MLLeaksFinder引入了FBRetainCycleDetector,可以检查循环引用。

内存泄漏分为2种,第1种是对象没有被任何引用,在内存中没有被释放。第2种是对象发生循环引用,无法被释放。在RAC的场景下,通过是2引起的内存泄漏。

阅读全文