0

пункт 1 в делегат:Почему экземпляр ViewController был выпущен, когда его представление все еще находится в списке подпрограмм другого представления?

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. Вопрос: Почему friendCollectionVC внутри FriendListVC был выпущен? Доступны приложения AppDelegate и AppDelegate.friendListVC и AppDelegate.friendListVC.view. ДругListVC.view содержит subview friendCollectionVC.view. - см. код 2. И проект использует ARC.

+0

Вы добавили self.friendListVC = [[FriendListVC alloc] init]; к супервизу? Вы что-то сделали с ним, кроме как из [[alloc] init]? – Greg

ответ

1

Вы не храните сильный указатель на friendCollectionVC, так как вы создаете его как локальную переменную. Добавление своего представления в качестве подзадачи не делает ничего, чтобы изменить этот факт. В любом случае, неплохо просто добавить представление одного контроллера в качестве подсмотра другого представления контроллера. Когда вы добавляете представление friendCollectionVC в качестве подчиненного представления FriendListVC, вы должны сделать friendCollectionVC дочерним контроллером просмотра FriendListVC, используя пользовательский контейнерный контроллер api. Если вы это сделаете, у FriendListVC будет сильный указатель (в его массиве childViewControllers) на friendCollectionVC.

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

спасибо. Я думаю ты прав. Дай мне попробовать. – fluke

Смежные вопросы