当我们在日常开发中,如果涉及到一些iOS底层的东西就可能会遇到方法编码,这是了解这门语言必不可少的一个环节。
&SideTables()[oldObj]
这是什么?很多人看到这里都被这操作搞蒙了,下面分三步来理解,分别是SideTables()
、[oldObj]
、&
。先贴上入口的代码
id oldObj;
SideTable *oldTable;
oldObj = *location;
oldTable = &SideTables()[oldObj];
本文较长分三篇按序阅读体验更佳,第四篇为辅助阅读按需看
带着问题看源码:
- 大家都知道weak的底层实现是一个散列表,那么散列表的结构是什么样的?
- 散列表的key是什么,value是什么,散列函数是怎样的?
- 通过几次查找才能找到对应的弱引用?
- 如何查找弱引用对象的引用计数?
- 一个对象对应一个
SideTable
表而一个SideTable
对应多个对象,为什么这样设计
本文较长分三篇按序阅读体验更佳,第四篇为辅助阅读按需看
正文 接 Weak的实现(二)
3 设置弱引用标志位
正文 接 Weak的实现(一)
2 生成新的weak_entry_t
插入到weak_entries
中
信号触发方式
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
方法来触发订阅,注意调用一次触发一次。