仅运行一次这个需求,一般我们会第一个想到用 GCD 的方式实现:
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
...
});
然而,这能令我们满足么?显然不能。无形装逼,最为致命:
#import <objc/runtime.h>
if (objc_getAssociatedObject(self, _cmd)) return;
objc_setAssociatedObject(self, _cmd, @YES, OBJC_ASSOCIATION_RETAIN);
...
简单解读一下,这个实现是利用 runtime 对象绑定来完成的。探测 self
对象是否有绑定了键为 _cmd
的对象。如果有则直接 return,如果没有,则动态绑定一个任意对象到 self
上面,并且执行下面的语句。
然而有啥用?代(ran)码(er)不(bing)用(mei)缩(sha)进(luan)了(yong)~