我正在观看关于Itunes的CS193P斯坦福课程,并在其中一个讲座中给出了一个演示, 据说你可以以模态方式呈现viewcontroller,然后释放它。大致相同(我知道这不完美,但我在我的电脑上)
[self.view presentcontentmodally:myVC]
[myVC release];
然而,这似乎会产生问题。如果我在这两行之间放置一个NSLog(@"%d", [myVC retainCount])
,那么它返回2表示可以释放。但是当我解雇myVC
应用程序崩溃时。 NSlog和调试器中的任何内容都不会显示它停止的位置。
但是我使用了malloc-history或某些博客说会有所帮助的东西。并发现它是myVC。
我应该发布myVC吗?
(当modalVC被解散时,应用程序的内存使用量是否会在modalVC出现之前回复?)
答案 0 :(得分:0)
是的,您应该在将视图控制器传递给模态导航控制器后将其释放。除非您打算手动管理其版本,否则请确保您没有传入以前保留的视图控制器。
例如,请遵循此处_myViewController
的生命周期:
MyViewController *_myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:nil];
UINavigationController *_modalNavigationController = [[UINavigationController alloc] initWithRootViewController:_myViewController];
[_myViewController release], _myViewController = nil;
[[self navigationController] presentModalViewController:_modalNavigationController animated:YES];
[_modalNavigationController release], _modalNavigationController = nil;
模态导航控制器将增加_myViewController
的保留计数,基本上取得它的所有权。
一旦模态导航控制器被解除并且您回到原始导航控制器,模态导航控制器将收到release
消息,并依次release
其根视图控制器({{1} })。
此视图控制器的保留计数将为零,然后回收内存。
答案 1 :(得分:0)
我刚刚查看了几个应用程序,并且我在每次演示后都会发布我的模态视图控制器,没有任何问题。这让我觉得你还没有理解Cocoa内存管理模型。这是一个示例:
TweetController *tweetController = [[TweetController alloc] init];
tweetController.content = content;
tweetController.delegate = self;
[self presentModalViewController:tweetController animated:YES];
[tweetController release];
请注意,此控制器是使用alloc / init创建的,之前未发布或自动释放。
另外,请不要依赖保留计数检查;保留可以来自之前的自动释放,这将很快消失,导致您看到的那种错误。