我正在复制一个UIView,这样当我从副本(B)中删除子视图时,它不会影响原始(A)。我正在使用archivedDataWithRootObject和unarchiveObjectWithData,如下所示:
NSData *viewData = [NSKeyedArchiver archivedDataWithRootObject:viewA];
UIView *viewB = [NSKeyedUnarchiver unarchiveObjectWithData:viewData];
但是我不知道这样做是否意味着每次归档视图时它都会永久存储在iPone上,或者是否在某个时候发布。我查看了课程参考,但没有找到答案。
我正在使用XCode 6,IOS 7.1和Objective C.
答案 0 :(得分:0)
执行摘要:假设您没有将NSData
保存在某处并将视图副本视为普通视图,那么您正在做的事情看起来很好并且似乎没有泄漏内存。
更多详细信息:您的第一行创建了NSData
。当释放对此NSData
的所有强引用时,系统将释放它并回收其内存。如果viewB
是局部变量,并且您没有在其他地方存储指向NSData
的指针,那么它将在系统发出下一个事件(触摸,警报,等等)之前释放,运行循环消耗自动释放池。
您的第二行会创建UIView
。当释放对此UIView
的所有强引用时,系统将释放它并回收其内存。大概你是将视图添加为另一个视图的子视图; superview将保留子视图。稍后,最终,如果从超级视图中删除子视图,或者取消分配超级视图,并且删除了对视图的任何其他引用,它将在系统传递另一个事件之前释放,此时运行循环将自动释放池。
使用归档程序创建NSData
不会创建任何“永久” - 它不会在文件系统中创建任何文件。如果您没有将NSData
写入文件,那么当您的进程退出时(由于重启,崩溃或内存不足警告),系统肯定会回收其内存以及您的进程专用的所有其他内存而其他一些应用程序在前台)。