【问题标题】:Xcode Memory Debugger showing instances of already removed objects - iOSXcode 内存调试器显示已删除对象的实例 - iOS
【发布时间】:2020-01-29 01:03:54
【问题描述】:

请参阅附图以供参考。所有viewControllers 已从应用程序中删除,但内存调试器显示其实例以及所有属性。当我单击内存调试器的Show Only Leaked blocks 过滤器时,viewControllers 和其他实例不会出现在其中。这是否意味着没有泄漏?

我该如何解决这个问题。什么意思?

我在CartViewControllercellForRowAtIndexPath 中确实有PKYStepper 块(步进器在我的TableViewCell 中是UIControl)方法如下:

PKYStepper *qtyStepper = [cell viewWithTag:993];

qtyStepper.tappedCallback = ^(PKYStepper *stepper) {

            NSLog(@"Tapped!");

            rowSelected = indexPath;

            if (((Dish*)((MenuSubSection*)_section.subSections[0]).dishesArray[indexPath.row]).disheOptions.count)
            {
                UIWindow *window = [UIApplication sharedApplication].keyWindow;

                NSBundle* bun = [NSBundle bundleWithIdentifier:@"com.test.test"];

                DishItemOption *dishOptions = [[bun loadNibNamed:@"DishItemOption" owner:self options:nil] objectAtIndex:0];
                dishOptions.frame = CGRectMake(0, 0, window.frame.size.width, window.frame.size.height);

                dishOptions.dish = [[Dish alloc] initWithDishObject:((Dish*)((MenuSubSection*)_section.subSections[0]).dishesArray[indexPath.row])];
                dishOptions.delegate = self;
                [window addSubview:dishOptions];
            }

        };

如何让它引用弱我?

【问题讨论】:

  • 你确定那些视图控制器被释放了吗?请注意,即使视图控制器不再出现在屏幕上,也并不意味着没有任何其他强引用使其保持活动状态。
  • 好吧,我打电话给[self dismissViewControllerAnimated:YES completion:nil];,它应该关闭堆栈中的所有视图控制器,对吧?假设呈现的视图控制器是一个导航视图控制器。
  • 好吧,关闭视图控制器并不能保证视图控制器将被释放,只是控制器将不再是 UI 层次结构的一部分。如果其他人保持对控制器的强引用,则该引用将使其保持活动状态。看看你发布的图片,看起来像一个块是让控制器保持活动状态的块 - 它很可能是一个保留循环。
  • 找到该块并将其粘贴到问题中。您能建议如何解决保留周期吗?

标签: ios objective-c xcode memory-management memory-leaks


【解决方案1】:

看起来您可能已经在某种回调块中捕获了视图控制器。

具体来说,PKYStepper 似乎有一个强烈引用视图控制器的回调块。要么确保所述引用是弱引用,要么确保在视图控制器被拆除时块被正确销毁。

【讨论】:

  • 一种常见的模式是在@escaping 闭包中使用weak self,以避免保留循环,例如:obj.closure = { [ weak self ] in ... }
  • @bbum 你是对的。我在那个 View Controller 中有 PKYStepper 回调,但我不知道如何让它引用 Wea​​k Self。在我的问题中添加了块。任何帮助将不胜感激。谢谢!
【解决方案2】:

找到了解决办法。将我的回调更新为以下内容:

__weak typeof(self) weakSelf = self;

    qtyStepper.incrementCallback = ^(PKYStepper *stepper, float newValue) {

        CartViewController *sSelf = weakSelf;

        [sSelf updateTotalCharges]; //Had to use WEAKSELF in the callback!

    };

【讨论】:

    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2010-11-15
    • 2018-05-15
    相关资源
    最近更新 更多