0

在将对象添加到NSMutableArray. 奇怪的是,我添加的前 8 个对象一切正常,但是当添加第 9 个对象时,应用程序在检索该对象时崩溃。

UploadStatus *status = [[UploadStatus alloc] initWithStatus:[NSString stringWithFormat:@"%@: %d", NSLocalizedString(@"uploadPictureSucceeded", @""), pic_id] 
                                                 andImageInProgress:nil 
                                                    imageForSuccess:nil 
                                                     imageForFailed:nil];
[self.delegate notify:status];
[status release];

这是在几个不同文本的地方进行的。但是这个对象包含我在UITableView.

notify委托的方法中,我将UploadStatus对象添加到NSMutableArray并重新加载UITableView显示该数组内的对象。

前 8 次我将UploadStatus对象添加到数组并重新加载表,它显示正确。但是第 9 次我收到错误[CFString retain]: message sent to deallocated instance 0x5c655c0。在方法中重新加载表时会发生此错误cellForRowAtIndexPath

奇怪的是,它总是显示里面的对象NSMutableArray超出范围,就像这个截图一样:

在此处输入图像描述

尽管如此,如果我获取项目,将其转换为UploadStatus类并从中获取status,一切都会顺利进行(对于前 8 个对象)。

UploadStatus有没有人知道为什么在将第 9 个对象添加到后会出错NSMutableArray

非常感谢你的帮助!

4

2 回答 2

1

问题在于这段代码:

[NSString stringWithFormat:@"%@: %d", NSLocalizedString(@"uploadPictureSucceeded", @""), pic_id]

您没有保留字符串,因此它会在下一次执行运行循环时消失。您对前 8 个很幸运。由于某种原因,它们碰巧没有被覆盖,或者可能是其他一些对象保留了它们。但是第 9 个不是,你终于看到了错误的结果。

您需要 UploadStatus 对象来保留该字符串(并稍后释放它)。

于 2012-01-28T23:59:18.380 回答
0

我注意到您在此代码块中直接访问您的 ivars,而不是使用访问器。这几乎可以肯定是您问题的根源(它是 ObjC 中内存管理问题的第一大原因)。切换到访问器,您的大部分内存管理问题都会消失。

您还应该继续运行静态分析器(Build>Analyze)。它可能会有所启发。问题可能不在上面的代码中;它是您存储某些东西的地方,很可能是在 ivar 中。

于 2012-01-29T00:45:57.837 回答