在模态呈现后释放viewcontroller

时间:2010-05-16 08:04:53

标签: iphone objective-c xcode memory-management

我正在观看关于Itunes的CS193P斯坦福课程,并在其中一个讲座中给出了一个演示, 据说你可以以模态方式呈现viewcontroller,然后释放它。大致相同(我知道这不完美,但我在我的电脑上)

[self.view presentcontentmodally:myVC]
[myVC release];

然而,这似乎会产生问题。如果我在这两行之间放置一个NSLog(@"%d", [myVC retainCount]),那么它返回2表示可以释放。但是当我解雇myVC应用程序崩溃时。 NSlog和调试器中的任何内容都不会显示它停止的位置。

但是我使用了malloc-history或某些博客说会有所帮助的东西。并发现它是myVC。

我应该发布myVC吗?

(当modalVC被解散时,应用程序的内存使用量是否会在modalVC出现之前回复?)

2 个答案:

答案 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创建的,之前未发布或自动释放。

另外,请不要依赖保留计数检查;保留可以来自之前的自动释放,这将很快消失,导致您看到的那种错误。