为什么ViewController实例在其视图仍在另一个视图的子视图列表中时被释放?

时间:2013-11-29 16:30:29

标签: ios objective-c uiviewcontroller automatic-ref-counting

指向代表:

self.friendListVC = [[FriendListVC alloc] init];

第2点。 在FriendCollectionVC.mm中:

- (void)viewDidLoad
{
    [super viewDidLoad];

    FriendCollectionVC *friendCollectionVC = [[FriendCollectionVC alloc] init];
    [self.view addSubview:friendCollectionVC.view];
}

点3.运行: 使用lldb:

po [self collectionView].delegate
p [self collectionView]

结果: [没有Objective-C描述] (PSTCollectionView *)$ 6 = 0x212bc400

点4.继续运行。 使用lldb:

po [self collectionView].delegate
p [self collectionView]

结果:

2013-11-30 00:15:25.637 App[45683:70b] *** -[FriendCollectionVC respondsToSelector:]: message sent to deallocated instance 0x67259eb0
[no Objective-C description available]
(PSTCollectionView *) $6 = 0x6785eca0

并同时使用lldb:

po ((MyAppDelegate *)[[UIApplication sharedApplication] delegate]).friendListVC.view
<UIView: 0x6656efa0; frame = (0 0; 945 748); autoresize = W+H; layer = <CALayer: 0x665d0fd0>>

第5点。问题: 为什么FriendListVC中的friendCollectionVC被释放了? AppDelegate和AppDelegate.friendListVC以及AppDelegate.friendListVC.view都可用。 friendListVC.view包含子视图friendCollectionVC.view。 - 见代码2。 该项目正在使用ARC。

1 个答案:

答案 0 :(得分:1)

您没有保留任何指向friendCollectionVC的强指针,因为您将其创建为局部变量。将其视图添加为子视图不会改变这一事实。在任何情况下,仅将一个控制器的视图添加为另一个控制器视图的子视图并不是一个好主意。当您将friendCollectionVC的视图添加为FriendListVC视图的子视图时,您应该使用自定义容器控制器api使friendCollectionVC成为FriendListVC的子视图控制器。如果你这样做,FriendListVC将有一个强指针(在其childViewControllers数组中)到friendCollectionVC。

- (void)viewDidLoad {
    [super viewDidLoad];
    FriendCollectionVC *friendCollectionVC = [[FriendCollectionVC alloc] init];
    [self addChildViewController:friendCollectionVC];
    [friendCollectionVC didMoveToParentViewController:self];
    [self.view addSubview:friendCollectionVC.view];
}