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中添加自定义对象时,需要将其设置为空。
| 归档时间: |
|
| 查看次数: |
351 次 |
| 最近记录: |