weakify和strongify

最近回顾了一下自己曾经写过的代码,发现在用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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值