何时弱到何时对块中的嵌套块进行强引用

时间:2014-11-26 11:20:47

标签: ios objective-c iphone objective-c-blocks weak-references

我正在我的代码中查找我的块中的保留周期。我在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];
            }];
        }];
    };
}

并提出以下问题:

  1. 我需要__weak哪个__strong参考?我确信第一和第二我必须使用,但我真的不确定第3和第4。
  2. 我可以在这里使用@strongify@weakify吗?
  3. 我想我不需要第(5)行,但我不确定。
  4. 任何建议,链接或好评都将不胜感激!

1 个答案:

答案 0 :(得分:3)

您确实需要一个弱引用,因为您有一个引用周期:self > UITableView > UITableViewCell > self

您无需使用__strong限定符。默认情况下,变量是强引用。

您不需要动态和转换完成处理程序的弱引用,因为转换完成后会立即释放这些块,但在这种情况下,它们无法使用self,因为它们&#39 ;重新嵌套在无法捕捉self的区块内。

因此请保留weakSelfstrongSelf,并在所有嵌套块中使用相同的strongSelf变量。