Source/TNLSafeOperation.m (43 lines of code) (raw):

// // TNLSafeOperation.m // TwitterNetworkLayer // // Created on 6/1/17 // Copyright © 2020 Twitter. All rights reserved. // #import "TNL_Project.h" #import "TNLSafeOperation.h" NS_ASSUME_NONNULL_BEGIN static BOOL _NSOperationHasCompletionBlockBug(void) { static BOOL sHasBug = NO; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ #if TARGET_OS_OSX // no bug on macOS sHasBug = NO; #else // bug fixed iOS 11 if (tnl_available_ios_11) { sHasBug = NO; } else { sHasBug = YES; } #endif }); return sHasBug; } @implementation TNLSafeOperation - (void)setCompletionBlock:(nullable void (^)(void))completionBlock { if (!_NSOperationHasCompletionBlockBug()) { [super setCompletionBlock:completionBlock]; return; } #pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-retain-cycles" [super setCompletionBlock:^{ if (completionBlock) { completionBlock(); } [self tnl_clearCompletionBlock]; }]; #pragma clang diagnostic pop } - (void)tnl_clearCompletionBlock { [super setCompletionBlock:nil]; } @end NS_ASSUME_NONNULL_END