将对象添加到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
内的对象超出了此屏幕截图中的范围:
然而,如果我获取该项目,将其转换为UploadStatus
类并从中获取status
,一切顺利(对于前8个对象)。
在向UploadStatus
添加第9个NSMutableArray
对象后,是否有人知道为什么会出错?
非常感谢你的帮助!
答案 0 :(得分:1)
问题在于此代码:
[NSString stringWithFormat:@"%@: %d", NSLocalizedString(@"uploadPictureSucceeded", @""), pic_id]
您没有保留字符串,因此在下次执行运行循环时会消失。你对前8个你很幸运。他们碰巧没有被某些原因覆盖,或者可能还有一些其他对象正在保留它们。但是第9个不是,你终于看到了错误的结果。
您需要使UploadStatus对象保留该字符串(稍后将其释放)。
答案 1 :(得分:0)
我注意到你在这段代码中直接访问你的ivars而不是使用访问器。这几乎肯定是你问题的根源(它是ObjC中内存管理问题的第一个原因)。切换到访问器,大多数内存管理问题都会消失。
您还应该继续运行静态分析器(Build> Analyze)。它可能会有所帮助。问题可能不在上面的代码中;它存放在你存放东西的地方,最有可能存放在伊瓦尔中。