Objective-C对象由于NSMutableArray中的内存管理而消失

时间:2012-01-28 23:43:21

标签: objective-c memory nsmutablearray zombie-process

将对象添加到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]:消息发送到解除分配的实例0x5c655c0 。在cellForRowAtIndexPath方法中重新加载表时会发生此错误。

奇怪的是,总是表明NSMutableArray内的对象超出了此屏幕截图中的范围:

enter image description here

然而,如果我获取该项目,将其转换为UploadStatus类并从中获取status,一切顺利(对于前8个对象)。

在向UploadStatus添加第9个NSMutableArray对象后,是否有人知道为什么会出错?

非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

问题在于此代码:

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

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

您需要使UploadStatus对象保留该字符串(稍后将其释放)。

答案 1 :(得分:0)

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

您还应该继续运行静态分析器(Build> Analyze)。它可能会有所帮助。问题可能不在上面的代码中;它存放在你存放东西的地方,最有可能存放在伊瓦尔中。