存储和检索自定义对象 (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 账簿,并在完成后清除分类帐。
希望有人能够阐明这个问题。
我正在使用 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 账簿,并在完成后清除分类帐。