【问题标题】:3D Peek and Pop memory leak3D Peek and Pop 内存泄漏
【发布时间】:2017-02-16 12:52:18
【问题描述】:

在实现 peek and pop 之后,我看到了一个问题,即注册视图以进行预览的控制器在视图被释放后没有释放视图。
我创建了一个带有 tableView 的简单项目,并且 viewController 将每个单元格注册为如下预览:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    PeekCell *cell = [tableView dequeueReusableCellWithIdentifier:kPeekCellIdentifier forIndexPath:indexPath];
    [self registerForPreviewingWithDelegate:self sourceView:cell];

    return cell;
}

问题是如果我上下滚动,因为单元格将被释放并创建新单元格。 viewController 将注册新单元格以进行预览,并且以这种方式内存正在增长。
问:我做错了什么?我什么时候应该打电话给unregisterForPreviewingWithContext

【问题讨论】:

    标签: ios objective-c uitableview memory-leaks 3dtouch


    【解决方案1】:

    不要在cellForRowAtIndexPath: 中注册previewing,而是试试:

    - (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{
        self.previewingContext = [self registerForPreviewingWithDelegate:self sourceView:cell];
    } 
    
    - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath{
        [self unregisterForPreviewingWithContext:self.previewingContext];
    }
    

    【讨论】:

    • 不,这不是一个解决方案,因为在您的示例中,我将始终为最后显示的单元格存储“previewingContext”,所以我想更好的方法是添加一个带有“previewingContext”的数组并取消注册在didEndDisplayingCell 中为indexPath
    【解决方案2】:

    您可以在单元格中定义 UIViewControllerPreviewing,而不是您在 @ystack cmets 中建议的数组解决方案 在 CellClass 内:

    var viewControllerPreviewing : UIViewControllerPreviewing? = nil
    

    在 tableView 或 CollectionView 内 行方法的单元格

        if cell.viewControllerPreviewing != nil {
            unregisterForPreviewing(withContext: cell.viewControllerPreviewing!)
        }
    
        cell.viewControllerPreviewing = self.regist3DTouch(cell:cell)
    

    这是 regist3DTouch 方法

    func regist3DTouch(cell:UIView)->UIViewControllerPreviewing?{
        if traitCollection.forceTouchCapability == UIForceTouchCapability.available {
            return registerForPreviewing(with: self, sourceView: (cell))
        }else{
            print("UIForceTouchCapability is not available")
            return nil
        }
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多