Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 打印对象的强所有者,Swift_Ios_Swift_Retain Cycle - Fatal编程技术网

Ios 打印对象的强所有者,Swift

Ios 打印对象的强所有者,Swift,ios,swift,retain-cycle,Ios,Swift,Retain Cycle,我的iOS应用程序中存在一些保留周期 对于陷入保留循环的特定viewController,我已尝试使所有代理都变弱。但当我从模拟器模拟内存警告时,调用了didReceiveMemoryWarning,但没有调用deinit方法 我想打印/查看调用DiReceiveMemoryWarning时仍持有它的viewController的所有者。我有什么办法可以做到这一点吗 您可以使用Denit方法进行打印,如 class Person { let name: String init(n

我的iOS应用程序中存在一些保留周期

对于陷入保留循环的特定viewController,我已尝试使所有代理都变弱。但当我从模拟器模拟内存警告时,调用了didReceiveMemoryWarning,但没有调用deinit方法


我想打印/查看调用DiReceiveMemoryWarning时仍持有它的viewController的所有者。我有什么办法可以做到这一点吗

您可以使用Denit方法进行打印,如

class Person {
    let name: String
    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}

您可以检查此项:

不,没有一种方法可以打印您描述的对象的所有者,至少不完全如此。iOS不使用垃圾收集,它使用ARC(自动引用计数)。系统不跟踪ARC中拥有的引用。相反,每次向对象添加所属引用时,系统都会增加保留计数,每次清除所属引用时,系统都会减少保留计数

不过,您可以使用内存工具运行程序。(有一个名为“Instruments”的调试应用程序,您可以选择在Instruments程序中使用的名为“instrument”的调试模板。)使用内存工具,您可以跟踪对象的生命周期,以及跟踪应用程序堆中活动对象的数量。。当您在当前活动对象列表中选择一个对象时,您可以看到该对象在程序中的分配位置以及创建强引用的代码的来源。然而,解释如何使用仪器超出了SO帖子的范围。有关于这个主题的各种教程和WWDC会议视频。我建议做一些搜索

至于您的问题,强制低内存警告不会导致活动视图控制器(屏幕上的)被释放,也不会调用它的deinit方法。系统维护对视图控制器的强引用


此外,默认情况下还应使委托引用变弱。让代理引用成为强引用是非常不寻常的。出于特定原因,我只看过一两次。

如果您使用的是Xcode 8,则可以使用内存图调试器直观地查看项目中对象的活动内存图。您可以使用下面显示的三个圆圈图标访问内存图调试器

从24:30左右开始的下一堂课中,在WWDC 2016上重点介绍了内存图调试器


我可能错了,但我认为你错不了您是否尝试过使用“泄漏”仪器进行轮廓测量?这可以显示保留周期。我不知道直接的方法,但是,如果你运行应用程序时附带了工具,并使用分配模板,您可以查看单个对象并查看其历史记录。请注意,收到内存警告并不意味着任何东西都会自动释放:您可以释放任何您持有强引用的对象,这些对象不再需要,或者可以在需要时重新创建。视图控制器本身只有在从视图控制器层次结构中删除后才会解除分配。是否在控制器中使用了nstimer?如果是,请确保在控制器未使用纯金时使此计时器无效!非常感谢,兄弟内存图调试器的优点。这是一个非常方便的工具,用于计算保留周期和其他内存问题。(表决)