希望有人能够对这个问题有所了解。
我正在使用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];
答案 0 :(得分:1)
这个答案只是评论的概要。
理解发生了什么的关键是一些对象 - 可能是视图控制器本身,但可能是一个自定义视图对象,无论如何 - 保留了您从NSUserDefaults
创建的对象。
我们减少了alloc
的数量,减少了内存增长量,这似乎证实了每次ViewDidLoad
被击中时,一个对象被创建但从未被释放,因为它的保留计数永远不会命中零。留在记忆中的其他一些对象正在强烈提及它。
此时,我只是建议在正确的视图生命周期函数(nil
?)中进行积极的viewDidDisappear
分配,并将其包含在@autoreleasepool
附件中以便进行测量。结果完全解决了这个问题。
将nil
分配给VC中的属性可确保strong
属性的数据在VC本身被释放之前不会保留在内存中。使用@autoreleasepool
告诉ARC取消分配零引用计数对象,这些对象在机箱终端的机箱内变为零引用计数。我正在考虑" pool"作为机箱内引用计数事务的分类帐。外壳保留了自己的ARC书籍,并在完成后清除其分类帐。