使用archiver-memory版本复制UIView



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

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

然而,我不知道这样做是否意味着每次我存档一个视图时,它都会永远存储在iPone上,还是会在某个时候发布。我看了一下课堂参考资料,但没有找到答案。

我使用的是XCode 6、IOS 7.1和Objective C.

执行摘要:假设您没有将NSData保存在某个位置,并且将视图副本视为普通视图,那么您所做的操作看起来很好,似乎不会泄露内存。

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

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

使用归档器创建NSData不会创建任何"永久"的东西——它不会在文件系统中创建任何文件。如果您不将NSData写入文件,那么当您的进程退出时(由于其他应用程序处于前台时出现重新启动、崩溃或内存不足警告),系统肯定会回收其内存以及所有其他进程专用内存。

最新更新