iphone-发送到解除分配实例的消息
希望你能帮我做这个… 到目前为止,我在目标C中看到了一些疯狂的行为,但这一次让我有自杀的念头。嗯,不是真的 这是一个解决解除分配对象的问题 情景: 我加载了带有RSS提要的tableView,当选择行时会打开一个DetailView,并在UIWebView中显示提要。因为我需要从DetailView中滑动到上一个提要和下一个提要的功能,所以我正在使用保存着的NSMutableDictionary初始化DetailViewiphone-发送到解除分配实例的消息,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,希望你能帮我做这个… 到目前为止,我在目标C中看到了一些疯狂的行为,但这一次让我有自杀的念头。嗯,不是真的 这是一个解决解除分配对象的问题 情景: 我加载了带有RSS提要的tableView,当选择行时会打开一个DetailView,并在UIWebView中显示提要。因为我需要从DetailView中滑动到上一个提要和下一个提要的功能,所以我正在使用保存着的NSMutableDictionary初始化DetailView 1.)键处所有(15)个提要的NSMutableArray:@“items
1.)键处所有(15)个提要的NSMutableArray:@“items”和
2.)NSNumber PositionArray,具有在TableView中选择的行的索引 我需要后者,这样我就可以通过保持当前提要所在的数组索引值来实现对上一个提要和下一个提要的滑动。使用此值,我可以加载PositionArray-1或PositionArray+1 在我的TableView中,我有:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//Call an action only if the pressed cells are not the adMob ones
if (indexPath.row != 0) {
NSMutableDictionary *theItem = [[NSMutableDictionary alloc] init];
[theItem setValue:items forKey:@"items"];
//Add the position of item in the items array to the NSDictionary for current item so it can be
//used in nextController to scroll to prev and next
NSNumber *positionInArray = [NSNumber numberWithInt:indexPath.row-1];
[theItem setValue:positionInArray forKey:@"positionInArray"];
DetailController *nextController = [[DetailController alloc] initWithItem:theItem];
[self.navigationController pushViewController:nextController animated:YES];
[nextController release];
[positionInArray release];
[theItem release];
}
现在,一切正常。我在TableView中选择一行,这将打开一个显示提要的DetailView。左右滑动显示所有提要,没有问题。但是如果我在TableView中选择最后一个提要或最后一个提要之前的提要,提要将按常规显示,但如果我尝试向左或向右滑动,则会出现以下错误:
2011-03-03 10:50:15.039 RssReader[72137:207] Swipe Right Movement done!
2011-03-03 10:50:15.041 RssReader[72137:207] *** -[CFNumber intValue]: message sent to deallocated instance 0x6240460
我试着启用僵尸和守卫Malloc,但这是我唯一得到的
这个问题的解决办法是真正让我思考的是:我是否理解内存分配/释放的含义:p如果我删除行
[PositionArray release]
或[ItItem release]
应用程序将正常工作???怎样?为什么?哦,为什么
我可以假装我理解,如果我释放positionInArray对象,它就不能在另一个对象NSMutableDictionarytheItem中传递。我之所以说假装,是因为我认为它正在使用它的副本(通过赋值)
另外,我不明白的是:
L删除行
[位置射线释放]代码>
此变量不保留,而是自动删除。您不需要释放positionInArray
。它是自动发布的。这些行是您的问题:
NSNumber *positionInArray = [NSNumber numberWithInt:indexPath.row-1];
[positionInArray release];
您正在alloc
/init
初始化所有其他变量。这意味着你有责任释放他们。对于NSNumber
实例,您没有调用alloc
,因此您不负责释放它,它是自动释放的。通过自己发布,这意味着在应用程序的某个后期阶段,当自动释放池被耗尽时,它将被第二次释放,因此出现难以调试的错误
有关详细信息,请阅读非常感谢。正如你们在我的第一篇文章中看到的,我解决了这个问题,但我不知道为什么会发生这个错误。我本应该预见到这一点,但我认为这是唯一一个不需要释放的NSString对象。问题是,为什么在打开前13个提要而不是最后两个提要时,在打开DetailView时滑动功能会起作用?如果你再次阅读我的第一篇文章,你会发现问题只发生在我打开最后两个提要中的一个并从中向左/向右滑动时。