【发布时间】:2020-01-29 01:03:54
【问题描述】:
请参阅附图以供参考。所有viewControllers 已从应用程序中删除,但内存调试器显示其实例以及所有属性。当我单击内存调试器的Show Only Leaked blocks 过滤器时,viewControllers 和其他实例不会出现在其中。这是否意味着没有泄漏?
我该如何解决这个问题。什么意思?
我在CartViewController 的cellForRowAtIndexPath 中确实有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