在UItableView中使用缓存的图像

时间:2010-09-20 11:14:04

标签: iphone

使用iOS 4.1 SDK。我在UITableView的每一行中使用了2个小图像。我想知道以下哪两种方法更好,方法1也有效吗?

- (void)viewDidLoad 
{
   // create the images amd assign to class member variable
   NSString *imgStr1 = [[NSBundle mainBundle] pathForResource:@"someImg1"                                                                         
                                                     ofType:@"png"];
   UIImage* img1 =  [[UIImage alloc] initWithContentsOfFile:imgStr];
   self.image1 = img1;
   [img1 release];

   NSString *imgStr2 = [[NSBundle mainBundle] pathForResource:@"someImg2"                                                                         
                                                     ofType:@"png"];
   UIImage* img2 =  [[UIImage alloc] initWithContentsOfFile:imgStr2];
   self.image2 = img2;
   [img2 release];


}

  - (UITableViewCell *)tableView:(UITableView *)tableView 
     cellForRowAtIndexPath:(NSIndexPath *)indexPath 
 {
    static NSString *cellIdentifier = @"cellIdentifier";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: 
                         cellIdentifier];
    if (cell == nil) 
    {

       //create image views here
       ..........................
     }

    / assign images from viewDidLoad to imageView here
     UIImageView *img1View = (UIImageView *)[cell viewWithTag:kImg1Tag];
     [img1View setImage:self.img1];
     etc....
  }

或者我应该在cellForRowAtIndexPath

中执行此操作
    [img1View setImage:[UIImage imageNamed:@"img1.png"];

2 个答案:

答案 0 :(得分:1)

在这种情况下,我会使用imageNamed:,因为它将缓存两个图像并正确响应内存警告情况。

方法一是有效的,但它与使用imageNamed:之间几乎没有区别。如果设备需要回收内存,则将清除使用imageNamed:创建的映像。除非你在收到内存警告时自己清除方法一中创建的图像,否则它们会留在内存中。

它也减少了你需要担心的代码,而且总是更好。减少代码==减少错误。

答案 1 :(得分:0)

我认为最简单的方法是使用UIImage的{​​{1}}方法,该方法从应用包中加载图像并将其保存在缓存中。

这样你只需要在imageNamed:方法中将单元格的UIImageView图像设置为[UIImage imageNamed:@"img1.png"]

另一点,如果您的单元格有很多子视图,我认为将其子类化并将不同的子视图添加为类属性会更好。然后,您只需在从cellForRowAtIndexPath:获取它时进行投射,并且它允许您在不使用标记和每次投射的情况下修改子视图。