Ios 无法解释的内存泄漏

Ios 无法解释的内存泄漏,ios,xcode,swift,memory-leaks,instruments,Ios,Xcode,Swift,Memory Leaks,Instruments,我有一个超级简单的基本应用程序 只有一个带有collectionView的viewcontroller 泄漏我的collectionViewFlowLayout很容易,我不知道为什么 Leaked Object # Address Size Responsible Library Responsible Frame __NSDictionaryM 1 0x7fcc4ca31340 48 Bytes UIKit UICollectionViewLayoutCommon

我有一个超级简单的基本应用程序

只有一个带有collectionView的viewcontroller

泄漏我的collectionViewFlowLayout很容易,我不知道为什么

Leaked Object   #   Address Size    Responsible Library Responsible Frame
__NSDictionaryM 1   0x7fcc4ca31340  48 Bytes    UIKit   UICollectionViewLayoutCommonInit
__NSDictionaryM 1   0x7fcc4ca313a0  48 Bytes    UIKit   UICollectionViewLayoutCommonInit
__NSDictionaryI 1   0x7fcc4ca31570  64 Bytes    UIKit   UICollectionViewFlowLayoutCommonInit
__NSDictionaryM 1   0x7fcc4ca313d0  48 Bytes    UIKit   UICollectionViewLayoutCommonInit
UICollectionViewFlowLayout  1   0x7fcc4ca310c0  512 Bytes   leak-application    ObjectiveC.UICollectionViewFlowLayout.__allocating_init (ObjectiveC.UICollectionViewFlowLayout.Type)() -> ObjectiveC.UICollectionViewFlowLayout
__NSDictionaryM 1   0x7fcc4ca31370  48 Bytes    UIKit   UICollectionViewLayoutCommonInit
__NSDictionaryM 1   0x7fcc4ca31400  48 Bytes    UIKit   UICollectionViewLayoutCommonInit
NSMutableIndexSet   1   0x7fcc4ca314e0  48 Bytes    UIKit   UICollectionViewLayoutCommonInit
NSMutableIndexSet   1   0x7fcc4ca31470  48 Bytes    UIKit   UICollectionViewLayoutCommonInit
__NSDictionaryM 1   0x7fcc4ca2f290  48 Bytes    UIKit   UICollectionViewLayoutCommonInit
这是我的密码

class ParallaxCollectionViewCell: UICollectionViewCell {

    let titleLabel = UILabel(frame: CGRectMake(0, 0, 100, 100))

    override init(frame: CGRect) {
        super.init(frame: frame)
        self.contentView.addSubview(titleLabel)
    }

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

}

class ViewController: UIViewController, UICollectionViewDelegateFlowLayout, UICollectionViewDataSource {

    var collectionView: UICollectionView?
    let collectionViewLayout = UICollectionViewFlowLayout()

    override func viewDidLoad() {
        super.viewDidLoad()
        setup()
    }

    func setup() {

        self.collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: self.collectionViewLayout)
        self.view.addSubview(self.collectionView!)

        self.collectionView?.delegate = self;
        self.collectionView?.dataSource = self;
        self.collectionView?.backgroundColor = UIColor.whiteColor()
        self.collectionView?.registerClass(ParallaxCollectionViewCell.self, forCellWithReuseIdentifier: "identfifier")

        self.collectionView?.reloadData()
    }

    override func viewDidLayoutSubviews() {
        self.collectionView?.frame = self.view.bounds
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        return CGSizeMake(CGRectGetWidth(self.view.bounds), 100)
    }

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let parallaxCell = collectionView.dequeueReusableCellWithReuseIdentifier("identfifier", forIndexPath: indexPath)  as ParallaxCollectionViewCell
        parallaxCell.titleLabel.text = "test"
        return parallaxCell
    }

    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }
}
如果我将collectionViewLayout属性设置为可选变量并在设置中分配它

var collectionViewLayout : UICollectionViewFlowLayout?
func setup() {
    self.collectionViewLayout = UICollectionViewFlowLayout()
    self.collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: self.collectionViewLayout!)
    ...

它不漏水。。但这不是解决方案?

我以前遇到过一个与NIB加载相关的Swift错误,它会导致属性初始化两次。如果我没有记错的话,在某些情况下,可以对同一个对象实例调用两个不同的指定初始值设定项,从而导致对象的实例属性被初始化两次,并且在第一次初始化期间实例化了任何内容。(这是在Cocoa应用程序中使用NSWindowController的早期Swift测试版中出现的。我不知道当前Swift版本中是否仍然存在该漏洞。)

这可以解释您在
collectionViewLayout
属性中看到的泄漏,以及在
setup()
中指定属性时为什么不泄漏

您可以使用工具查看创建了多少
UICollectionViewFlowLayout
实例,也可以在
-[UICollectionViewFlowLayout init]
中设置符号断点,查看在
ViewController
初始化期间是否调用了两次

否则,它可能只是泄漏检测器中的假阳性

要解决此问题,可以尝试重写
init(coder:)
并在该方法中初始化collectionViewLayout属性:

required init(coder aDecoder: NSCoder) {
    self.collectionViewLayout = UICollectionViewFlowLayout()
    super.init(coder:aDecoder)
}

但是,您需要确认此初始值设定项没有被调用两次。

我以前遇到过一个与NIB加载相关的Swift错误,该错误可能导致属性被初始化两次。如果我没有记错的话,在某些情况下,可以对同一个对象实例调用两个不同的指定初始值设定项,从而导致对象的实例属性被初始化两次,并且在第一次初始化期间实例化了任何内容。(这是在Cocoa应用程序中使用NSWindowController的早期Swift测试版中出现的。我不知道当前Swift版本中是否仍然存在该漏洞。)

这可以解释您在
collectionViewLayout
属性中看到的泄漏,以及在
setup()
中指定属性时为什么不泄漏

您可以使用工具查看创建了多少
UICollectionViewFlowLayout
实例,也可以在
-[UICollectionViewFlowLayout init]
中设置符号断点,查看在
ViewController
初始化期间是否调用了两次

否则,它可能只是泄漏检测器中的假阳性

要解决此问题,可以尝试重写
init(coder:)
并在该方法中初始化collectionViewLayout属性:

required init(coder aDecoder: NSCoder) {
    self.collectionViewLayout = UICollectionViewFlowLayout()
    super.init(coder:aDecoder)
}

但是,您需要确认此初始值设定项没有被调用两次。

我以前遇到过一个与NIB加载相关的Swift错误,该错误可能导致属性被初始化两次。如果我没有记错的话,在某些情况下,可以对同一个对象实例调用两个不同的指定初始值设定项,从而导致对象的实例属性被初始化两次,并且在第一次初始化期间实例化了任何内容。(这是在Cocoa应用程序中使用NSWindowController的早期Swift测试版中出现的。我不知道当前Swift版本中是否仍然存在该漏洞。)

这可以解释您在
collectionViewLayout
属性中看到的泄漏,以及在
setup()
中指定属性时为什么不泄漏

您可以使用工具查看创建了多少
UICollectionViewFlowLayout
实例,也可以在
-[UICollectionViewFlowLayout init]
中设置符号断点,查看在
ViewController
初始化期间是否调用了两次

否则,它可能只是泄漏检测器中的假阳性

要解决此问题,可以尝试重写
init(coder:)
并在该方法中初始化collectionViewLayout属性:

required init(coder aDecoder: NSCoder) {
    self.collectionViewLayout = UICollectionViewFlowLayout()
    super.init(coder:aDecoder)
}

但是,您需要确认此初始值设定项没有被调用两次。

我以前遇到过一个与NIB加载相关的Swift错误,该错误可能导致属性被初始化两次。如果我没有记错的话,在某些情况下,可以对同一个对象实例调用两个不同的指定初始值设定项,从而导致对象的实例属性被初始化两次,并且在第一次初始化期间实例化了任何内容。(这是在Cocoa应用程序中使用NSWindowController的早期Swift测试版中出现的。我不知道当前Swift版本中是否仍然存在该漏洞。)

这可以解释您在
collectionViewLayout
属性中看到的泄漏,以及在
setup()
中指定属性时为什么不泄漏

您可以使用工具查看创建了多少
UICollectionViewFlowLayout
实例,也可以在
-[UICollectionViewFlowLayout init]
中设置符号断点,查看在
ViewController
初始化期间是否调用了两次

否则,它可能只是泄漏检测器中的假阳性

要解决此问题,可以尝试重写
init(coder:)
并在该方法中初始化collectionViewLayout属性:

required init(coder aDecoder: NSCoder) {
    self.collectionViewLayout = UICollectionViewFlowLayout()
    super.init(coder:aDecoder)
}

但是,您需要确认此初始值设定项没有被调用两次。

因为
集合视图
有一个
委托
和一个
数据源
,您应该将其声明为
,以避免保留周期(泄漏).

由于
收集视图
有一个
委托
和一个
数据源
,您应该将其声明为
,以避免保留循环(泄漏)。

因为
收集视图
有一个
委托