weakSelf在Block中被引用,因其是弱引用的關系存在被釋放的風險。
在block中調用self會引起循環引用,但是在block中需要對weakSelf進行strong,保證代碼在執行到block中,self不會被釋放,當block執行完后,會自動釋放該strongSelf
__weak typeof(self)_self=self; 外部weak
__strong typeof(_self)self=_self; 內部strong
強弱引用轉換,用于解決代碼塊(block)與強引用self之間的循環引用問題
調用方式:@weakify_self實現弱引用轉換,@strongify_self實現強引用轉換
YYCategories 里的 YYCategoriesMacro.h
/**
Synthsize a weak or strong reference.
Example:
? ? @weakify(self)
? ? [self doSomething^{
? ? ? ? @strongify(self)
? ? ? ? if (!self) return;
? ? ? ? ...
? ? }];
*/#ifndefweakify#ifDEBUG#if__has_feature(objc_arc)#defineweakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;#else#defineweakify(object) autoreleasepool{} __block __typeof__(object) block##_##object = object;#endif#else#if__has_feature(objc_arc)#defineweakify(object) try{} @finally{} {} __weak __typeof__(object) weak##_##object = object;#else#defineweakify(object) try{} @finally{} {} __block __typeof__(object) block##_##object = object;#endif#endif#endif#ifndefstrongify#ifDEBUG#if__has_feature(objc_arc)#definestrongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object;#else#definestrongify(object) autoreleasepool{} __typeof__(object) object = block##_##object;#endif#else#if__has_feature(objc_arc)#definestrongify(object) try{} @finally{} __typeof__(object) object = weak##_##object;#else#definestrongify(object) try{} @finally{} __typeof__(object) object = block##_##object;#endif#endif#endif
用的時候就
@weakify(self)dispatch_group_async(_operationsGroup, _operationsQueue, ^{? ? @strongify(self)if(self){//安全生產,放心使用? ? }} );
這兩個宏一定成對出現,先@weakify再@strongify.可以很好的管理Block內部對self的引用
鏈接:http://www.lxweimin.com/p/021680aba82a 出處