你好我正在学习iOS编程
我创建了一个项目,这是一个空的应用程序
我创建了没有xib文件的表视图控制器。
我在didFinishLaunchingWithOptions
中插入了以下代码TableViewController *tvc = [[TableViewController alloc] init];
[self.window addSubView:tvc.view];
[tvc release];
当我向下滚动时,此代码崩溃了。那是为什么?
当我评论此代码时
[tvc release];
程序不会崩溃。
我没有在AppDelegate文件中写dealloc。
为什么会这样?
我想我用alloc
创建了表视图控制器所以保留计数为1。
并向窗口和表视图控制器添加子视图保留计数为2。
所以我发布了表视图控制器
但是当我向下滚动时它会崩溃。
我不知道为什么......
请帮助我答案 0 :(得分:2)
很简单,添加tvc.view
作为窗口的子视图会导致tvc.view
被保留,但不会保留tvc
本身。实质上,只要您在其上调用TableViewController
,您的release
实例就会失效。大概是因为TableViewController
实例被配置为UITableView
或UIScrollView
或与tvc.view
相关联的任何其他事物的委托或数据源,应用程序会崩溃。
另请注意,显示视图的方式不是推荐的方法。实际上你应该调用presentModalViewController:
或pushViewController:
并传递TableViewController
实例。这将导致TableViewController
被保留,直到被解除/弹出为止,这样您就可以像在示例代码中一样调用release
。
或者,由于您是在didFinishLaunchingWithOptions
的一部分手动进行此设置,因此您也可以直接设置window.rootViewController
,但不是真的推荐。 XCode允许您指定应用程序的默认/根视图控制器,并在应用程序启动时自动为您设置。
答案 1 :(得分:0)
实际上你刚刚添加了视图。因此,仅保留观点。 viewcontroller将被释放。但是viewcontroller需要是tableview的数据源和委托。由于它已被解除分配,该数据源将没有任何有效的引用,因此它会崩溃。