iOS 生命周期注意点
viewWillAppear和viewDidAppear什么时候被调用
- 当你调用pushViewController:animated把一个视图控制器压入UINavigationController的时候,UINavigationController会自动调用这些方法。
- 当你abBarController时,UITabBarController会直接调用这些方法,
- 当你使用presentModalViewController时也会调用方法。
- 当一个视图控制器的视图被添加到一个window中时也会调用这些方法。
注意这种情况下是不会调用的
[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?
- 这个类被release的时候会被调用;
- 这个对象的retain count为0的时候会被调用;
二、在dealloc中应该做的事
- 使用CFRelease()去释放非OC类的对象(CF类),因为它们的纯C的,ARC管不着。
- 释放观察行为(KVO,noticication)。可以防止向不存在的对象发送通知造成crash。
- (void)dealloc {
CFRelease(someCoreFoundationObjects);
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
三、遇到的问题
A类创建了两个对象a1、a2 , B单列对象.delegate= a1,a2不需要,当a2对象被销毁的时候,执行了dealloc,dealloc中释放代理 ,B单列对象.delegate= nil,造成a1对象不能再收到代理方法了。