0

你好我正在学习iOS编程

我创建了一个项目,这是一个空应用程序

我创建了没有 xib 文件的表视图控制器。

我在 didFinishLaunchingWithOptions 中插入了以下代码

TableViewController *tvc = [[TableViewController alloc] init];
[self.window addSubView:tvc.view];
[tvc release];

当我向下滚动时,这段代码崩溃了。这是为什么?

当我评论这段代码时

[tvc release];

程序不会崩溃。

我没有在 AppDelegate 文件中写 dealloc。

这是为什么??

我想我用 alloc 创建了表视图控制器

所以保留计数为1。

并将子视图添加到窗口和表视图控制器保留计数为 2。

所以我发布了表格视图控制器

但是当我向下滚动时它崩溃了。

我不知道为什么..

请帮帮我

4

2 回答 2

2

很简单,添加tvc.view为窗口的子视图会导致tvc.view保留但不会保留tvc自身。从本质上讲,您的TableViewController实例一经调用就会失效release。当您滚动时,应用程序崩溃大概是因为TableViewController实例被配置为与.UITableView或.UIScrollViewtvc.view

另请注意,您显示视图的方式不是推荐的方式。真的,您应该调用presentModalViewController:pushViewController:传递TableViewController实例。这将导致TableViewController它被保留,直到它被解除/弹出,使您可以安全地调用release您的示例代码。

或者,由于您是作为 的一部分手动执行此设置的didFinishLaunchingWithOptions,因此您也可以window.rootViewController直接设置,但同样不建议这样做。XCode 允许您指定应用程序的默认/根视图控制器,并在应用程序启动时自动为您设置。

于 2012-04-12T03:55:46.140 回答
0

实际上,您只是单独添加了视图。因此,将仅保留视图。视图控制器将被释放。但是 viewcontroller 需要成为 tableview 的数据源和委托。由于它已被释放,该数据源将没有任何有效的引用,因此它会崩溃。

于 2012-04-12T03:54:30.237 回答