使用归档器复制 UIView - 内存释放?

Posted

技术标签:

【中文标题】使用归档器复制 UIView - 内存释放?【英文标题】:Copy UIView using archiver - memory release? 【发布时间】:2014-10-06 02:03:38 【问题描述】:

我正在复制 UIView,这样当我从副本 (B) 中删除子视图时,它不会影响原始视图 (A)。我正在使用 archivedDataWithRootObject 和 unarchiveObjectWithData 像这样:

NSData *viewData = [NSKeyedArchiver archivedDataWithRootObject:viewA];
UIView *viewB = [NSKeyedUnarchiver unarchiveObjectWithData:viewData];

但是我不知道这样做是否意味着每次我归档一个视图时,它都会永久存储在 iPone 上,或者它是否会在某个时候发布。我查看了类参考,但没有找到答案。

我正在使用 XCode 6、ios 7.1 和 Objective C。

【问题讨论】:

【参考方案1】:

执行摘要:假设您没有将NSData 保存在某处并且您将视图副本视为普通视图,那么您正在做的事情看起来很好并且似乎没有泄漏内存。

更多细节:您的第一行创建了一个NSData。当所有对此NSData 的强引用被释放时,系统将释放它并回收它的内存。如果viewB 是一个局部变量,并且您没有在其他任何地方存储指向NSData 的指针,那么它将在系统传递下一个事件(触摸、警报等)之前释放,此时运行循环耗尽自动释放池。

您的第二行创建了一个UIView。当所有对此UIView 的强引用被释放时,系统将释放它并回收它的内存。大概您正在将视图添加为另一个视图的子视图;该超级视图将保留子视图。稍后,最终,如果您从父视图中删除子视图,或者当父视图被释放时,并且您删除了对视图的任何其他引用,它将在系统传递另一个事件之前被释放,当运行循环耗尽自动释放时游泳池。

使用归档器创建NSData 不会创建任何“永久”的东西——它不会在文件系统中创建任何文件。如果您不将NSData 写入文件,那么当您的进程退出时(由于重新启动、崩溃或内存不足警告,而某些其他应用程序在前台)。

【讨论】:

以上是关于使用归档器复制 UIView - 内存释放?的主要内容,如果未能解决你的问题,请参考以下文章

需要OpenGL GPU内存清理吗?

如何在 C# 中释放在 C++ 中分配的内存

jvm内存结构

Linux释放内存小脚本

请教关于QT中内存释放的问题

释放内存时是不是需要使用IF语句? [复制]