注意:如果有类似的问题,我很抱歉,但它们更具体一些,比如"UIMapView工具包内存泄漏问题“,我更关心和很想知道在Swift和ARC中的内存管理问题。
我已经用Xcode做了几个应用程序,但是都是在Objective中完成的。
在objects中,UIKit对象(包括UIViews和UIViewControllers)和任何其他对象的内存管理都很容易处理,我的意思是在学习曲线的某个点与它斗争之后,很容易地适应它。
现在,我正在与斯威夫特合作,试图跟上“尖端”技术。然而,我注意到在目标C,内存管理中,我所能确定和控制的东西有一个小小的问题。
斯威夫特说,对于我们来说,更多地关注代码开发是多么容易,而不是像它的前辈或即将到来的前辈那样的内存管理。然而,我还没有找到这种好处。我的新应用程序的内存管理经历了一段糟糕的时光。只要用几个视图创建一个简单的UIViewController,就可以积累我不再需要的内存,一次只需要很少的Mb。
请记住,我一直在使用解构函数(Swift中的Deinit),对不再需要使用的值分配为零,手动从超级视图中删除SubViews,认为这是问题所在,甚至使用AutoReleasePool代码段。
autoreleasepool{
//Code looping through Swift Native Objects that potentially might lead to leaking
//But AutoReleasePool helps with this, supposedly.
}现在的问题是:在座的任何人都会知道到底是什么问题?是我用代码做了什么坏事吗?或者,Xcode和快速内存管理中真的存在bug吗?有没有其他人有过这个问题,你解决了吗?
这里有一个链接来解释一下这种情况。Swift中的ARC问题? 斯威夫特苹果文档中的弧形
更新:
你说得对,我应该发表更多关于我的情况的文章:就这样吧。
应用程序一启动,我的内存就从5 5mb开始。
一旦我开始浏览应用程序。我注意到记忆是如何一点一点地堆积起来的。但当我使用UIMapView of about 25+ Mbs时,内存最大的峰值开始堆积起来。
当只使用常规的UITableViewController时,每次我按(到NavController)相同的UITableViewController时,它就会堆积起来~2mb。当我选择这个TableViewCell时,它会打开另一个带有UIMapView的ViewController,这就是内存开始堆积的地方。
回忆一下,我只是来回浏览这个应用程序。总共4 UIViewControllers,包括我的菜单。
但问题是..。您看到的所有这些内存SnapShots都是在我停止导航并返回主菜单,即导航控制器的根ViewController之后。




发布于 2014-10-27 15:49:36
Swift使用ARC的方式与ObjC完全一样。如果您看到一个漏洞,您可能会在某个地方创建一个retain循环,并且您将以与ObjC中几乎完全相同的方式避免这些循环(附加的选项是使用未拥有的,但它们非常类似于unsafe_unretained,因此即使这也不是一个很大的改变)。如果您熟悉Cocoa中的内存管理,那么您可以理解Swift中的内存管理。但基于你在这里提供的信息(这似乎只是对可可的评论),我们情不自禁。
autoreleasepool{
//Code looping through Swift Native Objects that potentially might lead to leaking
//But AutoReleasePool helps with this, supposedly.
}尽管如此,这句话暗示了你的错误。自动释放池需要进入一个循环,在该循环中,您正在快速创建和销毁对象,而不是围绕它。直到池块结束或事件循环结束时,才会释放自动释放的对象。后者通常是足够的,但是如果您正在生成和释放大量对象,那么有时您必须更快地耗尽池。自动释放池在高级内存管理编程指南中解释。也就是说,UIKit对象通常不需要它们。
顺便提一下,“Swift中的ARC问题?”您提供的链接似乎不知道Cocoa垃圾收集的历史。GC被苹果在Mac上试用,但被Cocoa拒绝。苹果反对GC,并随后删除了它(我在WWDC当他们宣布它被废弃时,我们鼓掌了)。它甚至更不适用于iOS。关于这个问题的一个很好的讨论是在移动web应用程序慢的原因中。我不是说GC是坏事。我的意思是,苹果很清楚这一点,并积极选择不合并它。他们不只是错过了一个机会。
编辑:您的更新信息看起来像一个相当标准的保留循环。我从堆射分析开始,找出所涉及的对象类型。确保你是遵循规则。然后从那里出发,主要是使用仪器(特别是分配和泄漏仪器)。一个关键是视图控制器通常不应该保留其他视图控制器。他们应该通过模特儿互相交谈。您必须小心地在块中使用self。正常的规则。它们在ObjC和Swift中都是一样的。但是投篮绝对是开始的地方。找出漏水的原因,然后找出原因。
https://stackoverflow.com/questions/26590774
复制相似问题