我不知道为什么这个表视图代码崩溃了

时间:2012-04-12 03:49:44

标签: iphone objective-c ios xcode

你好我正在学习iOS编程

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

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

我在didFinishLaunchingWithOptions

中插入了以下代码
TableViewController *tvc = [[TableViewController alloc] init];
[self.window addSubView:tvc.view];
[tvc release];

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

当我评论此代码时

[tvc release];

程序不会崩溃。

我没有在AppDelegate文件中写dealloc。

为什么会这样?

我想我用alloc

创建了表视图控制器

所以保留计数为1。

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

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

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

我不知道为什么......

请帮助我

2 个答案:

答案 0 :(得分:2)

很简单,添加tvc.view作为窗口的子视图会导致tvc.view被保留,但不会保留tvc本身。实质上,只要您在其上调用TableViewController,您的release实例就会失效。大概是因为TableViewController实例被配置为UITableViewUIScrollView或与tvc.view相关联的任何其他事物的委托或数据源,应用程序会崩溃。

另请注意,显示视图的方式不是推荐的方法。实际上你应该调用presentModalViewController:pushViewController:并传递TableViewController实例。这将导致TableViewController被保留,直到被解除/弹出为止,这样您就可以像在示例代码中一样调用release

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

答案 1 :(得分:0)

实际上你刚刚添加了视图。因此,仅保留观点。 viewcontroller将被释放。但是viewcontroller需要是tableview的数据源和委托。由于它已被解除分配,该数据源将没有任何有效的引用,因此它会崩溃。