为啥我的 NSMutableArray 在 cellForRowAtIndexPath 中“半死”?

Posted

技术标签:

【中文标题】为啥我的 NSMutableArray 在 cellForRowAtIndexPath 中“半死”?【英文标题】:Why is my NSMutableArray "half dead" in cellForRowAtIndexPath?为什么我的 NSMutableArray 在 cellForRowAtIndexPath 中“半死”? 【发布时间】:2011-05-03 22:07:18 【问题描述】:

在 rootViewController.h 我有一个属性 NSMutableArray mainList:

@interface RootViewController : UITableViewController     
    NSMutableArray *mainList;

@property (nonatomic, retain) NSMutableArray *mainList;
@property (nonatomic, retain) IBOutlet DetailsViewController *detailsController;

在m文件中,加载时,以下工作正常:

- (void)viewDidLoad

self.mainList = [[NSArray alloc] initWithObjects:@"Country1", @"Contry2", nil];

按类填充数组也可以正常工作(首次加载时):

innehall *myInnehall= [[innehall alloc] init];
[myInnehall fillMain];
self.mainList = myInnehall.theMainList;
[myInnehall release];

(调试器显示数组中的数据正确)

滚动时,应用程序在设置单元格标签时崩溃:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

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

cell.textLabel.text = [self.mainList objectAtIndex: [indexPath row]];
return cell;

在调试器中,数组仅填充 1-9 而不是最多 19。10-19 包含奇怪的对象。什么可以吃我的阵列??

【问题讨论】:

您发布的代码看起来都不是问题的根源。当您使用第一种填充数组的方法时,会发生任何奇怪的事情。您只在按类填充时提到了一个问题。问题可能来自您分配、填充和释放 myInnehall.theMainList 的代码。 【参考方案1】:

首先,您的 NSMutableArray 属性必须正确初始化,例如:

self.mainList = [[NSMutableArray alloc] init];

(不是NSArray

然后,您将您的属性mainList 指向myInnehall.theMainList,然后您将其释放,这就是导致崩溃的原因。

尝试将myInnehall 项目添加到您的mainList

[self.mainList addObjectsFromArray:myInnehall.theMainList];

【讨论】:

PS:请不要复制您的对象...只需将现有项目添加到您的数组中,当然,除非您非常清楚 NSArray 如何实现 NSCopying 协议。【参考方案2】:

尝试改变

self.mainList = myInnehall.theMainList;

self.mainList = [myInnehall.theMainList copy];

您也可以将NSLog([self.mainList description]) 放入您的 cellForRowAtIndexPath 并发布结果吗?


PS:你在属性声明中有 NSMutableArray 并将其初始化为 NSArray?

【讨论】:

谢谢Kashiv,问题是通过复制而不是指向来解决的。

以上是关于为啥我的 NSMutableArray 在 cellForRowAtIndexPath 中“半死”?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 NSMutableArray 没有被填充?

为啥 NSMutableArray 元素没有被释放?

为啥我不能在 iOS 中 RemoveAllObjects 的 NSMutableArray?

为啥不将值添加到 NSMutableArray?

NSMutableArray,removeFromArray 和 release,为啥会崩溃?

为啥 UITableView 不从数组中填充