我正在我的代码中查找我的块中的保留周期。我在UITableViewController
:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
//[...] Not important code.
__weak ELParkingLocationTVC *weakself = self; // Required? (1)
cell.completionBlock = ^ {
__strong ELParkingLocationTVC *strongSelf = weakself; // Required? (2)
__weak ELParkingLocationTVC *weak2self = weakself; // Required? (3)
[strongSelf dismissViewControllerAnimated:YES completion:^{
__strong ELParkingLocationTVC *strong2self = weak2self; //Required? (4)
ELMenuHistoryTVC *menuTVC = [strong2self.navigationController.viewControllers firstObject];
[menuTVC.parentTabBarController moveToTab:ELMapViewControllerIndex completion:^(BOOL finished) {
ElMainMapViewController *mainMapViewController = menuTVC.parentTabBarController.viewControllers[ELMapViewControllerIndex];
//ELCustomParkplace *customParkplace = [strong2self parkplaceAtIndex:indexPath.row]; //(5)
[mainMapViewController moveToCoordinate:customParkplace.coordinate];
}];
}];
};
}
并提出以下问题:
__weak
哪个__strong
参考?我确信第一和第二我必须使用,但我真的不确定第3和第4。 @strongify
和@weakify
吗? 任何建议,链接或好评都将不胜感激!
答案 0 :(得分:3)
您确实需要一个弱引用,因为您有一个引用周期:self > UITableView > UITableViewCell > self
。
您无需使用__strong
限定符。默认情况下,变量是强引用。
您不需要动态和转换完成处理程序的弱引用,因为转换完成后会立即释放这些块,但在这种情况下,它们无法使用self
,因为它们&#39 ;重新嵌套在无法捕捉self
的区块内。
因此请保留weakSelf
和strongSelf
,并在所有嵌套块中使用相同的strongSelf
变量。