weakify和strongify

来源:互联网 发布:编程猫 是个怎样的公司 编辑:程序博客网 时间:2024/06/11 20:53

最近回顾了一下自己曾经写过的代码,发现在用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的好文章。

0 0
原创粉丝点击