强弱循环引用宏

294 阅读1分钟
转载我朴神的
/**
 *  强弱引用转换,用于解决代码块(block)与强引用self之间的循环引用问题
 *  调用方式: `@weakify_self`实现弱引用转换,`@strongify_self`实现强引用转换
 *
 *  示例:
 *  @weakify_self
 *  [obj block:^{
 *  @strongify_self
 *      self.property = something;
 *  }];
 */
#ifndef	weakify_self
#if __has_feature(objc_arc)
#define weakify_self autoreleasepool{} __weak __typeof__(self) weakSelf = self;
#else
#define weakify_self autoreleasepool{} __block __typeof__(self) blockSelf = self;
#endif
#endif
#ifndef	strongify_self
#if __has_feature(objc_arc)
#define strongify_self try{} @finally{} __typeof__(weakSelf) self = weakSelf;
#else
#define strongify_self try{} @finally{} __typeof__(blockSelf) self = blockSelf;
#endif
#endif