iOS之解决强弱循环引用的宏

一,完整代码:

#define WeakSelf @weakify(self);
#define StrongSelf @strongify(self);
#ifndef weakify
#if DEBUG
#if __has_feature(objc_arc)
#define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;
#else
#define weakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object;
#endif
#else
#if __has_feature(objc_arc)
#define weakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object;
#else
#define weakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object;
#endif
#endif
#endif
#ifndef strongify
#if DEBUG
#if __has_feature(objc_arc)
#define strongify(object) autoreleasepool{} __typeof__(object) strong##_##object = weak##_##object;
#else
#define strongify(object) autoreleasepool{} __typeof__(object) block##_##object = block##_##object;
#endif
#else
#if __has_feature(objc_arc)
#define strongify(object) try{} @finally{} __typeof__(object) strong##_##object = weak##_##object;
#else
#define strongify(object) try{} @finally{} __typeof__(object) block##_##object = block##_##object;
#endif
#endif
#endif


二,疑问:

1. 不能设置宏为全局变量:

将宏设置为全局变量时,使用WeakSelf 或者使用weakify(self) 是没有问题的.  但是弱引用的对象不是self, 而是一个webView ,那么就可能会释放不掉.
所以将上面的宏作为一个局部变量.

2,__typeof(object) 和__typeof__(object)的区别. 2中写法都可以,但是建议宏使用__typeof__(object)

iOS之解决强弱循环引用的宏_第1张图片



你可能感兴趣的:(iOS-OC,iOS-封装)