iOS中的方法编码

当我们在日常开发中,如果涉及到一些iOS底层的东西就可能会遇到方法编码,这是了解这门语言必不可少的一个环节。

阅读全文

Weak的实现-&SideTables()[oldObj]

&SideTables()[oldObj]这是什么?很多人看到这里都被这操作搞蒙了,下面分三步来理解,分别是SideTables()[oldObj]&。先贴上入口的代码

id oldObj;
SideTable *oldTable;

oldObj = *location;
oldTable = &SideTables()[oldObj];

阅读全文

Weak的实现(一)

本文较长分三篇按序阅读体验更佳,第四篇为辅助阅读按需看

  1. Weak的实现(一)
  2. Weak的实现(二)
  3. Weak的实现(三)
  4. Weak的实现-&SideTables()[oldObj]

带着问题看源码:

  1. 大家都知道weak的底层实现是一个散列表,那么散列表的结构是什么样的?
  2. 散列表的key是什么,value是什么,散列函数是怎样的?
  3. 通过几次查找才能找到对应的弱引用?
  4. 如何查找弱引用对象的引用计数?
  5. 一个对象对应一个SideTable表而一个SideTable对应多个对象,为什么这样设计

阅读全文

CombineLatest、Zip和Merge的区别

信号触发方式

merge

只要merge之后生成的信号被订阅就会自动触发所有压缩信号的订阅回调,如果靠前的信号出现了error后面的信号不再发送。

核心方法:- (instancetype)flatten
值:多次收到,分开的

 1
 2
RACSignal *s1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
  [subscriber sendNext:@"1"];
    return nil;
}];

RACSignal *s2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    [subscriber sendNext:@"2"];
    return nil;
}];

[[RACSignal merge:@[s1,s2]] subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];

阅读全文

Connect

将冷信号包装成热信号,初始化冷信号,调用publish方法会自动生成一个RACMulticastConnection,该对象持有了原始信号和一个热信号。

- (RACMulticastConnection *)publish {
	RACSubject *subject = [[RACSubject subject] setNameWithFormat:@"[%@] -publish", self.name];
	RACMulticastConnection *connection = [self multicast:subject];
	return connection;
}
- (RACMulticastConnection *)multicast:(RACSubject *)subject {
	[subject setNameWithFormat:@"[%@] -multicast: %@", self.name, subject.name];
	RACMulticastConnection *connection = [[RACMulticastConnection alloc] initWithSourceSignal:self subject:subject];
	return connection;
}

调用connect方法来触发订阅,注意调用一次触发一次。

阅读全文

作者的图片

董二千

愿你走出半生 归来仍是少年

iOS Developer

China