最近回顾了一下自己曾经写过的代码,发现在用Block的地方大量的运用到了weakSelf和strongSelf。还记得自己曾经在使用Block的时候,明明定义了weakSelf,由于block中代码很多,导致不小心有个地方忘记使用weakSelf而造成循环使用,于是,就寻思着有啥好办法可以简化weakSelf和strongSelf,避免再犯错误呢?答案就是weakify和strongify。趁此机会学习并记录一下,也顺便改正一下自己曾经写过的代码。
一个简单的宏定义:
// weakify
#define weakify(var) __weak __typeof(var) weak_##var = var;
// strongify
#define strongify(var) \
_Pragma("clang diagnostic push") \
_Pragma("clang diagnostic ignored \"-Wshadow\"") \
__strong __typeof(var) var = weak_##var; \
_Pragma("clang diagnostic pop")
举例:
Model *model = [Model new];
weakify(self);
model.dataChanged = ^(NSString *title) {
strongify(self);
self.label.text = title;
};
self.model = model;
相关文章引用:
https://github.com/jspahrsummers/libextobjc/blob/master/extobjc/EXTScope.h,原始代码,实现比较复杂,但根本原理相同。
http://holko.pl/2015/05/31/weakify-strongify/ 本文就是借鉴的此文。
http://stackoverflow.com/questions/28305356/ios-proper-use-of-weakifyself-and-strongifyself 这里很好的解释了strongify的工作。
其它参考:
http://www.samirchen.com/ios-autorelease-pool/ 介绍了##连接符
http://www.cnblogs.com/alexshi/archive/2012/03/09/2388453.html 一篇介绍autoreleasspool的好文章。