weakSelf在Block中被引用,因其是弱引用的關(guān)系存在被釋放的風(fēng)險(xiǎn)刘莹。
在block中調(diào)用self會(huì)引起循環(huán)引用,但是在block中需要對(duì)weakSelf進(jìn)行strong,保證代碼在執(zhí)行到block中翎迁,self不會(huì)被釋放栋猖,當(dāng)block執(zhí)行完后,會(huì)自動(dòng)釋放該strongSelf
__weak typeof(self)_self= self; 外部weak
__strong typeof(_self) self =_self; 內(nèi)部strong
強(qiáng)弱引用轉(zhuǎn)換汪榔,用于解決代碼塊(block)與強(qiáng)引用self之間的循環(huán)引用問(wèn)題
調(diào)用方式: @weakify_self
實(shí)現(xiàn)弱引用轉(zhuǎn)換蒲拉,@strongify_self
實(shí)現(xiàn)強(qiáng)引用轉(zhuǎn)換
YYCategories 里的 YYCategoriesMacro.h
/**
Synthsize a weak or strong reference.
Example:
@weakify(self)
[self doSomething^{
@strongify(self)
if (!self) return;
...
}];
*/
#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) object = weak##_##object;
#else
#define strongify(object) autoreleasepool{} __typeof__(object) object = block##_##object;
#endif
#else
#if __has_feature(objc_arc)
#define strongify(object) try{} @finally{} __typeof__(object) object = weak##_##object;
#else
#define strongify(object) try{} @finally{} __typeof__(object) object = block##_##object;
#endif
#endif
#endif
用的時(shí)候就
@weakify(self)
dispatch_group_async(_operationsGroup, _operationsQueue, ^
{
@strongify(self)
if(self){
//安全生產(chǎn)肃拜,放心使用
}
} );
這兩個(gè)宏一定成對(duì)出現(xiàn),先@weakify再@strongify.可以很好的管理Block內(nèi)部對(duì)self的引用