0

问题:

我用 nslog 检查每个视图以检查视图是否已释放,detailViewController 永远不会释放,一段时间后我收到内存警告,唯一调用的是 ViewDidUnload。

视图是如何调用的以及将哪些项目推送给它

该视图被调用并推送到一个表中,在 detailViewController 我有一个 searchResult 具有:

@property (nonatomic,weak) SearchResult *searchResult;

这是调用的 detailViewController:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

DetailViewController *controller = [[DetailViewController alloc]initWithNibName:@"DetailViewController" bundle:nil];

SearchResult *searchResult = [search.searchResults objectAtIndex:indexPath.row];
controller.searchResult = searchResult;
[self.navigationController pushViewController:controller animated:YES];

//made a property with (nonatomic,weak) DetailViewController and set it to the    controller
self.detailViewController = controller;
}

detailViewController 是如何处理的

-(void)back:(UIButton *)sender{


[self.navigationController popViewControllerAnimated:YES];

}

我认为问题是什么

我只是在猜测..我分配了一些函数,这些函数在 detailViewController 中分配了一些东西,但是如果我回去,那么这些东西会自动释放吗?它必须是保留的东西,但我无法弄清楚 detailViewController 中有什么我在 detailViewController 中有这些私有属性,例如:

@property (nonatomic, retain) iCarousel *carousel;
@property (nonatomic, retain) UINavigationItem *navItem;

但如果我离开视野,我该如何释放这些对象?或者这不是问题吗?

更新:

当我向后推时:

NSLog(@"%@", [self navigationController]);
[self.navigationController popViewControllerAnimated:NO];
NSLog(@"%@", [self navigationController]);

日志:

2013-01-13 19:33:30.703 App[21683:707] <UINavigationController: 0xfeafbf0>
2013-01-13 19:33:30.705 App[21683:707] (null)

我正在使用 ARC

4

2 回答 2

0

存储后controllerself.detailViewController您必须释放控制器,因为它是在此方法中较早分配的。所以代码会变成

self.detailViewController = controller;
[controller release];
于 2013-01-14T13:57:05.987 回答
0

您可能对 detailViewController 有一些强引用。

在您的 didSelectRow 方法中。您正在使用以下代码创建强引用:

self.detailViewController = controller;

弹出 detailViewController 后或收到内存警告时,只需设置

self.detailViewController = nil;

如果这不起作用,请检查您的其他代码以查看您是否正在创建任何其他强引用或保留循环,其中 detailViewController 可能对调用视图控制器具有强引用。

祝你好运

于 2013-01-13T16:51:17.890 回答