5

我有一个项目,其中有两个视图,在第一个视图中我显示了一个 uitableview。并在选择任何行单元格时打开另一个视图。

第一个视图有 10 个单元格,每个单元格在选中时会打开其他视图,其中包含最多 21 个视图和最少 1 个视图。

第二个视图中的每个视图由图像数组 tableview 和 tableview 中的许多子视图组成(图像数组也显示在具有多个图像视图的滚动视图中)

现在的问题是我无法释放我不知道的内存分配,因为根据我的代码分配的所有内容都是释放。我也尝试过乐器,但这不起作用。

以前,当我只访问一个视图时,它会使应用程序崩溃,因此我降低了图像的分辨率,现在它在没有其他应用程序打开时导航近 9 个应用程序,否则它适用于 6 个视图。现在我什至不能降低图像的分辨率,因为现在质量已经降低了。那么我怎么能减少这个完全不支持我的应用程序甚至不释放被占用的内存的内存分配。

确保您不要回复诸如仪器泄漏之类的建议,因为这没有帮助。我需要知道如何释放未使用的内存。

您可以看到在一个视图中有三个视图,这是一个滚动条,因此当您通过滚动进行导航时会显示更多视图,并且顶部还有一个图像,这也是一个滚动条。除此之外,还有一个显示详细信息的表格视图。但是当我创建这个视图时,我遇到了内存问题,因此我要从这个视图中释放所有内容,即使我试图在返回时删除整个视图。为此,我使用了“PagedFlowView”示例

https://github.com/kejinlu/PagedFlowView

上面的链接是针对 pagedflowview 示例的,下面的链接是针对我已经实现的代码参考类的,请检查我的类并让我知道在哪里可以改进它。

http://www.4shared.com/file/rHmRDr2E/SwipeExerciseViewController.html

4

6 回答 6

0

在处理图像时,请记住一件事。当您使用图像时,它不会像许多人所期望的那样占用它所显示的文件大小(即,对于 2048 x 1536 小于 3MB 的东西)。相反,它实际上是以原始格式加载的,基于如下计算占用内存:

宽度 x 高度 xn 字节,其中 n 是用于表示每个像素颜色的位数,通常为 4。

所以对于相同的 2048 x 1536 图像,它将占用 12MB。

所以现在检查你正在谈论的图像的原始分辨率是多少,并计算它需要多少 MB,并根据它更改你的代码。

于 2013-08-12T11:58:12.737 回答
0

起初 - 检查你的 dealloc,似乎你至少泄漏了音乐库(可能还有更多)。第二次 - 修改你的

- (UIView *)flowView:(PagedFlowView *)flowView cellForPageAtIndex:(NSInteger)index

在您当前的代码中:

如果视图为零:您正在创建自动释放池但没有耗尽它(最好使用@autoreleasepool 指令),那么您正在泄漏滚动视图(alloc/init,然后添加子视图,但看不到任何释放),然后是指针to image 设置为 nil,然后你试图释放它(给 nil 的消息是无操作的,上面的 imageview 也是如此)等等。这部分充满了从代码中看起来的泄漏。

如果视图不为零:您正在向这个已配置的视图添加新的滚动视图等(并且也会泄漏它们)。因此,您几乎是在重新创建它们,而不是仅仅重新配置这些视图。

我建议您为这些视图创建 UIView 的子类,创建一个公共方法,例如

- (void)configureWithParameters:(NSDictionary *)parameters;
- (id)initWithParameters:(NSDictionary *)parameters;

在该类中,当 flowview 要求查看时,首先尝试使可重用单元出列,如果它是 nil - alloc/init/autorelease 这个带有所需参数的视图,如果视图已经创建 - 使用配置方法。

此外 - 此代码需要大量重构。这将很难维护、更改或改进。

于 2013-08-19T04:45:21.457 回答
0

我刚刚快速浏览了 PagedFlowView 项目。实际上,我虽然错误地重用了您正在创建的 UIImageView,让内存增加​​。但似乎做得很好。我尝试了一个自动释放池(仅在 PagedFlowView 上使用提供的 .tiff 文件),似乎减少了 20% 的分配字节量。

在 PagedFlowView.m 文件的第 85 行中,您应该找到方法 removeCellAtIndex:(NSInteger)index

尝试以这种方式编辑它:

- (void)removeCellAtIndex:(NSInteger)index{
  UIView *cell = [_cells objectAtIndex:index];
  if ((NSObject *)cell == [NSNull null]) {
      return;
  }

  @autoreleasepool {

    [self queueReusableCell:cell];

    if (cell.superview) {
        cell.layer.transform = CATransform3DIdentity;
        [cell removeFromSuperview];
    }

    [_cells replaceObjectAtIndex:index withObject:[NSNull null]];
  }
}

那应该有帮助。但也许还不够。如果您仍然有问题,我可以更深入地了解 PagedFlowView 如何使用 _cells 和 _reusableCells。

于 2013-08-16T02:31:52.293 回答
0

查看您的代码后,我发现您每次都在单元格上分配 imageview 和 webview。当单元格为 nil 时,您可以通过添加 imageview 和 webview 来减少这部分。如您所知,单元格被重用,我们可以避免一些内存警告。

这是修改后的代码:

static NSString *store=@"cell";
    UITableViewCell *utvc = [[tableView dequeueReusableCellWithIdentifier:store] autorelease];
    if(utvc == nil)
    {
        utvc = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil] autorelease];

UIImageView *textView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 40, 276, 360)];
        textView.tag = 1001;  // some tag value
        [textView setImage:[UIImage imageNamed:@"bluelineBg.png"]];
        [utvc addSubview:textView];
        [textview release];

     UIWebView *webv = [[UIWebView alloc]initWithFrame:CGRectMake(0, -12, 277, 300)];
        webv.userInteractionEnabled = FALSE;
        webv.scrollView.scrollEnabled = FALSE;
        webv.tag = 1002;//some tag value
        [webv setBackgroundColor:[UIColor clearColor]];
        [webv setOpaque:NO];
        [utvc addSubview:webv];
        [webv releae];


    }
  UIImageView *imageview = [cell viewWithTag:1001];

[imageview setImage:[UIImage imageNamed:@"bluelineBg.png"]];

UIWebView *webView = [cell viewWithTag:1002];

[webView loadHTMLString:[NSString stringWithFormat:@"<html><body style='font-family:Helvetica; font-size:14px;background-color: transparent; '><head><style> OL{ color: #555555 } </style></head><br><b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mudra</b> : Prayer Pose<br><br><ol style=\"color:color: #999999;\"><li>Sit comfortably in easy pose with the legs crossed</li><li>Bring the palms together at the center of the chest</li><li>Inhale deeply</li><li>Chant 'Sat Nam' three times or chant the 'Long Time Sunshine' song to finish<br><br><i>Time per repetition : 15 Sec.</i></li></ol></body></html>"] baseURL:Nil];
于 2013-08-19T05:15:26.427 回答
0

我最近遇到了 UITableView 的问题,就我而言,这是错误的 UITableViewCell 的创建。事实上,至少有两件事需要检查:

  1. 考虑对 UITableViewCell 使用 autorelease:

    UITableViewCell * cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
    
  2. 最佳实践希望您UITableViewCell通过使用来重用实例[tableView dequeueReusableCellWithIdentifier](请参阅下面从 cellForRowAtIndexPath 获取的示例)

    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
        cell = [self tableViewCellWithReuseIdentifier:CellIdentifier];
    

第二部分,要求您分配和处理“标识符”(用于识别单元格的字符串)。

如果您仍有疑问,请考虑发布您的代码。问候,D。

于 2013-08-06T12:28:25.683 回答
0

添加 100 个空视图也不会导致内存问题,但添加 10 个图像会导致内存问题。重新考虑如何呈现数据的过程。

我可以建议的一种方法可能是减小您在第二个视图中显示的缩略图的大小,您说在那里会有 1 到 21 个视图。然后引入多余的步骤,例如单击该缩略图以获取具有原始分辨率图像的详细屏幕。

第二种方法,我能想到的是有一个占位符图像。异步只下载可见单元格的图片,并写入Cache目录,然后继续只显示可见单元格的图片

于 2013-08-16T14:14:11.217 回答