我已经读过当执行这样的块时:
__weak typeof(self) weakSelf = self; [self doSomethingInBackgroundWithBlock:^{ [weakSelf doSomethingInBlock]; // weakSelf could possibly be nil before reaching this point [weakSelf doSomethingElseInBlock]; }];
它应该这样做:
__weak typeof(self) weakSelf = self; [self doSomethingInBackgroundWithBlock:^{ __strong typeof(weakSelf) strongSelf = weakSelf; if (strongSelf) { [strongSelf doSomethingInBlock]; [strongSelf doSomethingElseInBlock]; } }];
所以我想复制一个情况,即weakSelf在块执行过程中变为nil.
所以我创建了以下代码:
* ViewController *
@interface ViewController () @property (strong,nonatomic) MyBlockContainer* blockContainer; @end @implementation ViewController - (IBAction)caseB:(id)sender { self.blockContainer = [[MyBlockContainer alloc] init]; [self.blockContainer createBlockWeakyfy]; [self performBlock]; } - (IBAction)caseC:(id)sender { self.blockContainer = [[MyBlockContainer alloc] init]; [self.blockContainer createBlockStrongify]; [self performBlock]; } - (void) performBlock{ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{ self.blockContainer.myBlock(); }); [NSThread sleepForTimeInterval:1.0f]; self.blockContainer = nil; NSLog(@"Block container reference set to nil"); } @end
* MyBlockContainer *
@interface MyBlockContainer : NSObject @property (strong) void(^myBlock)(); - (void) createBlockWeakyfy; - (void) createBlockStrongify; @end @implementation MyBlockContainer - (void) dealloc{ NSLog(@"Block Container Ey I have been dealloc!"); } - (void) createBlockWeakyfy{ __weak __typeof__(self) weakSelf = self; [self setMyBlock:^() { [weakSelf sayHello]; [NSThread sleepForTimeInterval:5.0f]; [weakSelf sayGoodbye]; }]; } - (void) createBlockStrongify{ __weak __typeof__(self) weakSelf = self; [self setMyBlock:^() { __typeof__(self) strongSelf = weakSelf; if ( strongSelf ){ [strongSelf sayHello]; [NSThread sleepForTimeInterval:5.0f]; [strongSelf sayGoodbye]; } }]; } - (void) sayHello{ NSLog(@"HELLO!!!"); } - (void) sayGoodbye{ NSLog(@"BYE!!!"); } @end
所以我期待createBlockWeakyfy将生成我想要复制的场景,但我没有设法做到这一点.
createBlockWeakyfy和createBlockStrongify的输出相同
HELLO!!! Block container reference set to nil BYE!!! Block Container Ey I have been dealloc!
有人能告诉我我做错了什么吗?