当前从UIScrollview释放内存的方法有很多图像

时间:2010-08-31 12:41:58

标签: ios objective-c memory-management uiscrollview

我正在生成一个简单的scrollView,其中一些图像附加到按钮上。 除了这个滚动视图占用相当多的内存这一事实之外,这种方法很好。

由于这个scrollView只是一个子菜单,允许用户选择一个图像,在我不需要它之后不久,我想从内存中释放这个重块。

请帮助我理解这个问题,并在不需要时释放这个巨大的内存块

int flipFlop = 1;
masksAvailable = 18;
float topMaskXX = 85.0;
float topMaskYY = 96.0;
UIButton *button;
for (int buttonsLoop = 1;buttonsLoop < masksAvailable+1;buttonsLoop++){


  button = [UIButton buttonWithType:UIButtonTypeCustom];
  NSString *tempname = [NSString stringWithFormat:@"mask_frame%i.png",buttonsLoop];

  // This fellow there is the memory eating monster
  [button setBackgroundImage:[UIImage imageNamed:tempname] forState:UIControlStateNormal];

  tempname = nil;

  button.tag = buttonsLoop;
  [button addTarget:self action:@selector(handleMaskKeys:) forControlEvents:UIControlEventTouchUpInside];


  UIImageView *frameForSubImages = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"image_frame.png"]];
  frameForSubImages.frame = CGRectMake(0.0, 0.0, 320.0/2.9, 480.0/2.9);
  frameForSubImages.center = CGPointMake(topMaskXX,topMaskYY);
  [scrollView addSubview:frameForSubImages];


  button.frame = CGRectMake(0.0, 0.0, 320.0/3.4, 480.0/3.4);
  button.center = CGPointMake(topMaskXX,topMaskYY);
  if (flipFlop == 1){
   topMaskXX += 150;
  } else {
   topMaskYY += 185.0;
   topMaskXX = 85.0;

  }
  flipFlop = flipFlop * -1;
  [scrollView addSubview:button];






}

1 个答案:

答案 0 :(得分:0)

首先,我建议您在项目中执行“全部清理”和“构建和分析”。它非常擅长指出保留/释放的问题。

其次,任何保留对象的类都应该定义一个“dealloc”来释放这些对象,以确保在释放对象时它们被删除。

-(void) dealloc {
    // release all retained objects here.

    [super dealloc];
}

第三,在上面的示例中,看起来frameForSubImages可能会有额外的保留,因为您已经分配了它(+1参考)并将其分配给视图(+1参考)永远调用release(这将是-1引用并留下refcount为1)。

最后,我还建议您阅读适用于iOS的Memory Management Programming Guide