iOS 生命周期注意点

2018-09-28  本文已影响40人  朝雨晚风

viewWillAppear和viewDidAppear什么时候被调用

注意这种情况下是不会调用的

[viewControllerA.view addsubView:viewControllerB.view]

当你添加你的视图控制器的视图作为一个视图的子视图而不是作为window的子视图,UIWindow 作为作为一个应用程序的根视图(root view),是旋转和初始布局消息等事件产生的来源。不是作为window的子视图,那么这个view就不会再接收到UIWindow传来的消息,像viewWillAppear:这种方法就不会被调用。你需要在作为容器的视图控制器中手动的调用嵌套控制器的viewWillAppear和viewDidAppear。
Apple 对 view controllers 的总的建议曾经是“一个 view controller 管理一个全屏幕的内容”。这个建议后来被改为“一个 view controller 管理一个自包含的内容单元”。

addchildviewcontroller

对于上面的应当使用addchildviewcontroller

[self addChildViewController:newVC];
[self.view addSubview:newVC.view];

在调用[父视图控制器 addChildViewController:子视图控制器]之前,无需显式调用[子视图控制器 willMoveToParentViewController:父视图控制器]方法,因为已经默认调用了。

在调用[父视图控制器 addChildViewController:子视图控制器]之后,要仅接着调用[子视图控制器 didMoveToParentViewController:父视图控制器]方法。

在调用[子视图控制器 removeFromParentViewController]之前,必须先调用[子视图控制器 willMoveToParentViewController:nil]。

在调用[子视图控制器 removeFromParentViewController]之后,无需显式调用[子视图控制器didMoveToParentViewController:父视图控制器],因为已经默认调用了。

在调用transitionFromViewController之前,调用[fromController willMoveToParentViewController:nil]。

在调用transitionFromViewController之后,调用[toController didMoveToParentViewController:父视图控制器]。

dealloc

一、什么时候回调用dealloc?

  1. 这个类被release的时候会被调用;
  2. 这个对象的retain count为0的时候会被调用;

二、在dealloc中应该做的事

- (void)dealloc {
  CFRelease(someCoreFoundationObjects);
  [[NSNotificationCenter defaultCenter] removeObserver:self];
}

三、遇到的问题
A类创建了两个对象a1、a2 , B单列对象.delegate= a1,a2不需要,当a2对象被销毁的时候,执行了dealloc,dealloc中释放代理 ,B单列对象.delegate= nil,造成a1对象不能再收到代理方法了。

上一篇 下一篇

猜你喜欢

热点阅读