NSCollectionView高山脉内存泄漏?

Wat*_*hiJ 7 macos xcode memory-leaks storyboard nscollectionview

我注意到通过Instruments在NSCollectionView中发生内存泄漏。当我查找代码时,它显示下面的特定行:

collectionView.makeItem(withIdentifier: identifier, for: indexPath) as? DisplayableCellProtocol
Run Code Online (Sandbox Code Playgroud)

然后我在Xcode,内存调试器中查看了它,发现有一些未引用的项目导致了泄漏。但是,并非由创建的所有项目都在makeItem泄漏,其中有些是正常的,但有些甚至没有显示。

托管的普通未泄漏项目类似于此图 正确

泄漏的是这样的(没有任何连接): 错误

那正常吗,其他人也有同样的问题吗?有谁知道如何正确解决这个问题?这与使用xib设计项目视图有关吗?

以下是一些有助于理解这种情况的代码:

func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem {
  let data = datasource[indexPath.item]
  let identifier: String = "ServiceCell"
  // Next line is where the leak occurs
  guard let cell = collectionView.makeItem(withIdentifier: NSUserInterfaceItemIdentifier(rawValue: identifier), for: indexPath) as? ServiceCell else {
      return ServiceCell(nibName: NSNib.Name("ServiceCell.xib"), bundle: Bundle.main)
  }
  cell.iconView.image = data.icon
  cell.serviceLabel.stringValue = data.name
  cell.introLabel.stringValue = data.content
  cell.highlighted = false
  return cell
}
Run Code Online (Sandbox Code Playgroud)

ServiceCell的定义是:

class ServiceCell: NSCollectionViewItem {
  @IBOutlet weak var iconView: NSImageView!
  @IBOutlet weak var serviceLabel: NSTextField!
  @IBOutlet weak var cmdLabel: NSTextField!
  @IBOutlet weak var introLabel: NSTextField!

  override func viewDidLoad() {
    super.viewDidLoad()
    // Do view setup here.
  }
}
Run Code Online (Sandbox Code Playgroud)

不确定代码在这里是否有帮助。我尝试查找自己的代码中是否有任何错误,但尚未找到任何错误。

同时,我发现了许多其他泄漏,其中大多数都指向makeItem生产线 在此处输入图片说明

更新:我再次浏览了它。因此,每次它将使实际需要的项目数量增加一倍。例如,我需要2个单元,它将创建4个而不是2个,其中两个是泄漏的单元。有任何想法吗?

Wat*_*hiJ 10

终于解决了。创建从NSCollectionViewItem创建xib文件继承的类时,默认情况下,在xib中将文件所有者的类设置为之前创建的子类。当我们在xib中添加自定义对象时,需要将其设置为空。

解

  • 这确实可以修复泄漏。不要忘记将出口重新连接到自定义对象,并将出口移到文件的所有者(如果有)。 (2认同)