消失的NSMutableArray导致UiTableView显示空白单元格

时间:2011-11-03 16:09:30

标签: objective-c ios uitableview nsmutablearray automatic-ref-counting

我有一个显示食谱列表的UITableView。我使用自定义类Recipe创建每个配方,然后将配方放入一个msmutable数组,'recipes'。麻烦的是,当我开始滚动'recipes'时,数组似乎丢失了所有数据(计数为0)。这意味着进入视图的单元格无法显示任何配方信息。究竟发生了什么?阵列为什么会消失?

代码如下:

// .h

#import "CustomCell.h"
#import "Recipe.h"
@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>
@property (weak, nonatomic) IBOutlet UITableView *recipeTableView;
@property (weak, nonatomic) NSMutableArray *recipes;


// .m
@synthesize recipeTableView;
@synthesize Recipes;

- (void)viewDidLoad
{
    [super viewDidLoad];
   Recipe *recipe1 = [[Recipe alloc] initWithCategory:@"Seafood" title:@"Recipe 1"];
    recipe1.recipeImage = [UIImage imageNamed:@"recipeImage1.png"];

    Recipe *recipe2 = [[Recipe alloc] initWithCategory:@"Seafood" title:@"Recipe 2"];
    recipe2.recipeImage = [UIImage imageNamed:@"recipeImage2.png"];

    Recipe *recipe3 = [[Recipe alloc] initWithCategory:@"Seafood" title:@"Recipe 3"];
    recipe3.recipeImage = [UIImage imageNamed:@"recipeImage3.png"];

    Recipe *recipe4 = [[Recipe alloc] initWithCategory:@"Seafood" title:@"Recipe 4"];
    recipe4.recipeImage = [UIImage imageNamed:@"recipeImage4.png"];

    Recipe *recipe5 = [[Recipe alloc] initWithCategory:@"Seafood" title:@"Recipe 5"];
    recipe5.recipeImage = [UIImage imageNamed:@"recipeImage5.png"];

    Recipe *recipe6 = [[Recipe alloc] initWithCategory:@"Seafood" title:@"Recipe 6"];
    recipe6.recipeImage = [UIImage imageNamed:@"recipeImage6.png"];

    Recipe *recipe7 = [[Recipe alloc] initWithCategory:@"Seafood" title:@"Recipe 7"];
    recipe7.recipeImage = [UIImage imageNamed:@"recipeImage7.png"];

    Recipe *recipe8 = [[Recipe alloc] initWithCategory:@"Seafood" title:@"Recipe 8"];
    recipe8.recipeImage = [UIImage imageNamed:@"recipeImage8.png"];

    Recipe *recipe9 = [[Recipe alloc] initWithCategory:@"Seafood" title:@"Recipe 9"];
    recipe9.recipeImage = [UIImage imageNamed:@"recipeImage9.png"];

    Recipe *recipe10 = [[Recipe alloc] initWithCategory:@"Seafood" title:@"Recipe 10"];
    recipe10.recipeImage = [UIImage imageNamed:@"recipeImage10.png"];


    recipes = [NSMutableArray arrayWithObjects:recipe1, recipe2, recipe3, recipe4, recipe5, recipe6, recipe7, recipe8, recipe9, recipe10, nil];

}




- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    Recipe *recipe = (Recipe*)[recipes objectAtIndex:indexPath.row];
    static NSString *CellIdentifier = @"RecipeCell";
    CustomCell *cell = (CustomCell *) [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    cell.titleLabel.text = recipe.title;
    return cell;
}

2 个答案:

答案 0 :(得分:1)

您的阵列正在自动释放,在配方分配后添加以下内容......

[recipes retain];

或者将创建数组的方式更改为...

recipes = [[NSMutableArray alloc] initWithObjects:.... etc

如果您在iOS5中使用ARC,那么您应该将您的食谱变量声明为强,这样可以有效地为您保留。

答案 1 :(得分:0)

@simon是对的。另外recipeTableView应该是(非原子的,强大的),只要你的视图被加载就可以保留它。一般来说,除非你有特殊原因需要,否则我会偏向使用强弱对弱。随着您对内存管理和对象生命周期越来越熟悉,您将发现需要/需要弱的情况。