情况一:当block是由独立的一个类【系统类方法、GCD等】这时候block里面的self 不需要弱化,因为这时候block强引用了self,但是self没有强引用block,当使用完 UIVIew会自己释放掉self,不会造成循环引用
[UIView animateWithDuration:animationTime animations:^{
if (notification.name == UIKeyboardWillShowNotification) {
//当为x 键盘输入的时候 tableview约束不用加50
if (kTabBarHeight > 49) {
self.bottomConstraint.constant = keyboardEndFrame.size.height+10;
}else{
self.bottomConstraint.constant = keyboardEndFrame.size.height+50;
}
strongSelf -> keyboardHeight = keyboardEndFrame.size.height;
}
} completion:^(BOOL finished) {
}];
情况二:当block的拥有者是self声明的一个属性,这时候在block中就需要使用__weak了,而又为了防止self在某时刻可能会释放掉 造成在block中想使用却为nil了 将weakself强引用,必须在block使用完后self才能释放
dispatch_group_t group = dispatch_group_create();
dispatch_group_async(group, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
// sleep(5);
__block NSArray *errorArr = [NSArray new];
if (!self) {
NSLog(@"self is missing");
}
[jqFmdb jq_inDatabase:^{
__strong typeof(weakSelf)strongSelf=weakSelf;
errorArr = [strongSelf ->jqFmdb jq_insertTable:groupMacroName dicOrModelArray:getArr];
}];
if (errorArr.count > 0) {
[SVProgressHUD showInfoWithStatus:@"有部分消息缓存失败"];
}
[self DealDataToLocalController:getArr];
if (self.dataArr.count > 15) {
// dataCount -= (self.dataArr.count - 15);
dataCount = dataCount + (self.dataArr.count - 15);
canRefresh = YES;
[self.dataArr removeObjectsInRange:NSMakeRange(0, self.dataArr.count - 15)];
}
NSLog(@"%d",self.dataArr.count);
});