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

时间:2017-07-17 07:19:48

标签: objective-c nsmutablearray nsuserdefaults nscoding custom-object

希望有人能够对这个问题有所了解。

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

enter image description here enter image description here

以下是我用来检索自定义对象数组的代码(在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];

1 个答案:

答案 0 :(得分:1)

这个答案只是评论的概要。

理解发生了什么的关键是一些对象 - 可能是视图控制器本身,但可能是一个自定义视图对象,无论如何 - 保留了您从NSUserDefaults创建的对象。

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

此时,我只是建议在正确的视图生命周期函数(nil?)中进行积极的viewDidDisappear分配,并将其包含在@autoreleasepool附件中以便进行测量。结果完全解决了这个问题。

nil分配给VC中的属性可确保strong属性的数据在VC本身被释放之前不会保留在内存中。使用@autoreleasepool告诉ARC取消分配零引用计数对象,这些对象在机箱终端的机箱内变为零引用计数。我正在考虑" pool"作为机箱内引用计数事务的分类帐。外壳保留了自己的ARC书籍,并在完成后清除其分类帐。