我正在尝试编写一个简单的ios7单视图应用程序。视图控制器有一个UI图像视图,占据整个屏幕,两个按钮占据屏幕的整个左侧和右侧。本质上,我希望能够通过单击下一个序列图像的右侧和前一个序列图像的左侧来滚动图像数组。
这个应用程序可以工作,但我的按钮代码中的指针似乎没有被删除。或者别的什么,我不太确定。每次我进入一个新的页面,就会有越来越多的内存被堆积起来,直到它以超过700 it的内存运行。请帮助我更好地理解这个内存分配问题。运行项目概要文件后,所有内存似乎都被“所有匿名VM”所使用
以下是视图控制器的代码。
#import "ABCViewController.h"
#import "ABCPage.h"
@interface ABCViewController ()
@end
@implementation ABCViewController
int current = 0;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
ABCPage *A = [[ABCPage alloc] init];
A.picture = [UIImage imageNamed:@"a.png"];
ABCPage *B = [[ABCPage alloc] init];
B.picture = [UIImage imageNamed:@"b.png"];
ABCPage *C = [[ABCPage alloc] init];
C.picture = [UIImage imageNamed:@"c.png"];
ABCPage *E = [[ABCPage alloc] init];
E.picture = [UIImage imageNamed:@"e.png"];
ABCPage *F = [[ABCPage alloc] init];
F.picture = [UIImage imageNamed:@"f.png"];
ABCPage *G = [[ABCPage alloc] init];
G.picture = [UIImage imageNamed:@"g.png"];
ABCPage *H = [[ABCPage alloc] init];
H.picture = [UIImage imageNamed:@"h.png"];
ABCPage *I = [[ABCPage alloc] init];
I.picture = [UIImage imageNamed:@"i.png"];
ABCPage *J = [[ABCPage alloc] init];
J.picture = [UIImage imageNamed:@"j.png"];
ABCPage *K = [[ABCPage alloc] init];
K.picture = [UIImage imageNamed:@"k.png"];
ABCPage *L = [[ABCPage alloc] init];
L.picture = [UIImage imageNamed:@"l.png"];
ABCPage *M = [[ABCPage alloc] init];
M.picture = [UIImage imageNamed:@"m.png"];
ABCPage *N = [[ABCPage alloc] init];
N.picture = [UIImage imageNamed:@"n.png"];
ABCPage *O = [[ABCPage alloc] init];
O.picture = [UIImage imageNamed:@"o.png"];
ABCPage *P = [[ABCPage alloc] init];
P.picture = [UIImage imageNamed:@"p.png"];
ABCPage *Q = [[ABCPage alloc] init];
Q.picture = [UIImage imageNamed:@"q.png"];
ABCPage *R = [[ABCPage alloc] init];
R.picture = [UIImage imageNamed:@"r.png"];
ABCPage *S = [[ABCPage alloc] init];
S.picture = [UIImage imageNamed:@"s.png"];
ABCPage *T = [[ABCPage alloc] init];
T.picture = [UIImage imageNamed:@"t.png"];
ABCPage *U = [[ABCPage alloc] init];
U.picture = [UIImage imageNamed:@"u.png"];
ABCPage *V = [[ABCPage alloc] init];
V.picture = [UIImage imageNamed:@"v.png"];
ABCPage *W = [[ABCPage alloc] init];
W.picture = [UIImage imageNamed:@"w.png"];
ABCPage *X = [[ABCPage alloc] init];
X.picture = [UIImage imageNamed:@"x.png"];
ABCPage *Y = [[ABCPage alloc] init];
Y.picture = [UIImage imageNamed:@"y.png"];
self.myBook = [[NSMutableArray alloc] init];
[self.myBook addObject:A];
[self.myBook addObject:B];
[self.myBook addObject:C];
[self.myBook addObject:E];
[self.myBook addObject:F];
[self.myBook addObject:G];
[self.myBook addObject:H];
[self.myBook addObject:I];
[self.myBook addObject:J];
[self.myBook addObject:K];
[self.myBook addObject:L];
[self.myBook addObject:M];
[self.myBook addObject:N];
[self.myBook addObject:O];
[self.myBook addObject:P];
[self.myBook addObject:Q];
[self.myBook addObject:R];
[self.myBook addObject:S];
[self.myBook addObject:T];
[self.myBook addObject:U];
[self.myBook addObject:V];
[self.myBook addObject:W];
[self.myBook addObject:X];
[self.myBook addObject:Y];
self.imageView.image = A.picture;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (IBAction)previousButton:(UIButton *)sender
{
if (current > 0) {
current--;
ABCPage *currentPage = [self.myBook objectAtIndex:current];
self.imageView.image = currentPage.picture;
}
}
- (IBAction)nextButton:(UIButton *)sender
{
if (current < 23) {
current++;
ABCPage *currentPage = [self.myBook objectAtIndex:current];
self.imageView.image = currentPage.picture;
}
}
@end发布于 2014-08-25 22:12:50
它的工作方式是,一旦将ABCPage放置到myBook数组中,数组就会在ABCPage上执行+1;这个“保留”将停止释放对象。您的页面引用一个图像,因此图像不会被取消分配。此外,当您将页面的图像分配给您的self.imageView时,它在设置的时间内会变成+2。
如果我没有记错,您需要告诉持有它需要更新的图像视图的视图。
[self.view setNeedsDisplay]否则,屏幕将不会显示新的图像。
匿名VM内存之所以会变得很高,是因为对于每个UIImage,VM子系统都分配了一个对等内存区域来“备份”包含图像数据的内存。当UIImage被释放时,对等内存就会被释放。
做调整,以减少内存,同时保持质量和速度平衡很好是棘手的。我建议先试一试,每次需要时加载图像,并且没有数组来预先存储它们。这意味着,您将做+1和-1的每一个图像,当你通过。在每次更改页面后,我还会发布一个setNeedsDisplay。您首先需要掌握内存泄漏的顶部,然后再从那里向前推进。
听起来这些图像都太大了,不适合内存,所以可能需要为当前页面附近的图像设置缓存。这可能是你接下来的步骤。
发布于 2014-08-25 17:47:38
为此,可以使用带有自定义单元格的UICollectionView,对于这种特殊情况,它将更好地工作。
UICollectionViews有一个叫做可重用单元的东西,这意味着它不会保存在没有被使用的内存单元中。如果可能的话,它将重用现有的。如果有必要的话,它只会创建新的。
UICollectionView有一种与UITableView类似的工作方式--在非常一般的术语中。
查看一下UICollectionView的文档,甚至你还可以往下看,在你的应用程序中添加滑动手势识别器,这是在视图之间进行水平排列的一种常见方法。
class/Reference/Reference.html
与您相关的是,内存泄漏只需使ABCPage *currentPage成为一个属性,而不是每次在下一次和前一次实例化它。将其作为类声明中的属性,并在执行ABCPage *currentPage时将其赋值,您正在创建新的实例,而对于您所提到的,这些实例不会从内存中释放。
https://stackoverflow.com/questions/25491374
复制相似问题