1.当blcok的生命中期在self的生命周期内 ,在block内部使用self是没有问题的,因为当self释放时,block中对self的强引用已经释放掉了
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
[self method1];
});
2.当block的生命周期没有在self的生命周期内,要使用wself,使用前判断一下wself是否为空
__weak typeof(self)wself = self;
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
if (wself) {
[wself getThumbnailImage:message.videoPath];
}
});
3.当block的生命周期没在self的生命周期内,且block中要调用多个self的方法或变量时,就要使用strongSelf,__strong 确保在 Block 内,strongSelf 不会被释放,当使用block执行完成strongSelf会被释放掉
__weak typeof(self)wself = self;
dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_SERIAL);
dispatch_async(queue, ^{
// if (wself) {
// [wself method1];
//如果使用wself执行method2时self可能已经被释放掉了,导致崩溃
// [wself method2];
// }
__strong typeof(wself)strongSelf = wself;
[strongSelf method1];
[strongSelf method2];
});
总结:
在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf。
如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。