alloc init release

时间:2012-01-08 10:31:41

标签: ios memory-management

  

可能重复:
  index 0 beyond bounds for empty array error

我是iOS编程的爱好者。编程时我总是遇到同样的问题。 我认为我不了解内存管理问题。 这是我的实际项目:

h文件: 包含NSStrings的NSMutableArray

NSMutableArray *pictureStrings;

@property (nonatomic,retain) NSMutableArray *pictureStrings;
m-File中的

@synthesize pictureStrings;

并在viewDidLoad方法

pictureStrings = [[NSMutableArray alloc] init];
dealloc方法

中的

[pictureStrings release];

好。我正在使用异步URL请求获取许多字符串,并在connectionDidFinishLoading Delegate方法中将值存储到pictureStrings

[pictureStrings addObject:aString];

BUT 当我在cellForRowAtIndexPath方法中读取值时,如

if (pictureStrings != nil) {
    cell.textLabel.text = [NSString stringWithFormat:@"%@", [pictureStrings objectAtIndex:indexPath.row]];
}

我的应用程序崩溃了消息:

  

*由于未捕获的异常'NSRangeException'而终止应用程序,原因:'* - [NSMutableArray objectAtIndex:]:索引0超出空数组的界限'

我的错在哪里? 请帮帮我!

你的,拉斐尔。 来自奥地利的问候

1 个答案:

答案 0 :(得分:3)

您的崩溃不是内存管理问题。你的崩溃就是你正在阅读数组的末尾。我们知道pictureStrings此时非{n},因为如果它为零,则objectAtIndex:方法将默认返回nil(因为消息nil返回{{ 1}} [1])。哦,更不用说你在nil的呼叫周围都有if - 但你可以安全地删除它,因为你不应该需要它。

因此,这里唯一真正发生的事情是在重新加载表视图之前没有调用objectAtIndex:。但是,这很奇怪,因为我假设您在表视图的[pictureStrings addObject:aString]数据源方法中执行类似return pictureStrings.count的操作。如果数组中确实存在零元素,则表视图不会要求任何行,并且您不会遇到此崩溃。

我认为您的问题很可能是您没有将字符串添加到数组中。您可以通过查看代码并查看正在发生的事情来检查。

另外,请考虑更改代码以将单元格的文本设置为:

tableView:numberOfRowsInSection:

你说他们已经是字符串了,为什么还要打扰cell.textLabel.text = [pictureStrings objectAtIndex:indexPath.row]; 来电?

[1]警告:并不总是返回stringWithFormat: - 请阅读相关信息。