存储和检索自定义对象 (ARC) 保持增长的内存

Storing and Retrieving Custom Object (ARC) Keeps growing memory

希望有人能够阐明这个问题。

我正在使用 NSCoding + NSUserDefaults 检索自定义对象数组,每次重新加载视图时,内存都会继续增长。

这是我用来检索自定义对象数组的代码(在 ViewDidLoad 下调用:

NSData *dataRepresentingSavedArray;

NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
dataRepresentingSavedArray = nil;
dataRepresentingSavedArray = [currentDefaults objectForKey:@"women"];
if (dataRepresentingSavedArray != nil)
{
    NSArray *oldSavedArray = nil;
    oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingSavedArray];
    if (oldSavedArray != nil)
        women = [[NSMutableArray alloc] initWithArray:oldSavedArray];
    else
        women = [[NSMutableArray alloc] init];
}

woman.backgroundimage 是导致内存丢失最多的原因,但是当我从自定义对象和 NSCoder 中完全删除该方面时,它仍然在内存中爬升而没有释放,但速度较慢。 ViewController 是导航控制器 (SWRevealViewController Pod) 的一部分,当它被选中时,内存会增加,直到应用程序崩溃。感谢您的宝贵时间!

编辑:我认为我还应该分享数据的归档方式。首先图像被压缩:

                 CGFloat maxCompressionFactor = 0.1f;
                 CGFloat compressionFactor = 0.9f;
                 int maxImageSize = 60 * 1024;

                 NSData *imageData = UIImageJPEGRepresentation(_theimage, compressionFactor);

                 while ([imageData length] > maxImageSize && compressionFactor > maxCompressionFactor)
                 {
                     compressionFactor = 0;
                     imageData = UIImageJPEGRepresentation(_theimage, compressionFactor);
                 }

                 _theimage = [UIImage imageWithData:imageData];
                 _theimage = [self scaleImage:_theimage toSize:CGSizeMake(320.0,480.0)];

然后存储所有值:

 //store to woman object
                 Woman* woman = [[Woman alloc] initWithFull:nameOfGirl withdate2:date withintervalLength:string  withperiodLength:[NSString stringWithFormat:@"432000"] withpmsLength:[NSString stringWithFormat:@"432000"]initWithbackground:_theimage];

                 NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

                 [women addObject:woman];

                 [userDefaults synchronize];

此回答只是评论的概要。

理解正在发生的事情的关键是某个对象——可能是视图控制器本身,但可能是自定义视图对象,无论如何——保留了你从 NSUserDefaults 创建的对象。

我们减少了 alloc 的数量,内存增长量也减少了,这似乎证实了每次 ViewDidLoad 被命中时,一个对象被创建但从未被释放,因为它的保留计数永远不会为零。留在内存中的其他一些对象保持对它的强引用。

那时,我只是建议在右视图生命周期函数(viewDidDisappear?)中进行积极的 nil 赋值,将其包裹在 @autoreleasepool 外壳中以备不时之需。结果完全解决了问题。

nil 分配给 VC 中的 属性 可确保 strong 属性 的数据不会保留在内存中,直到 VC 本身被释放。使用 @autoreleasepool 告诉 ARC 取消分配零引用计数对象,这些对象在封闭空间终止时在封闭空间内变为零引用计数。我将 "pool" 视为外壳内引用计数事务的分类帐。外壳保留自己的 ARC 账簿,并在完成后清除分类帐。